Teckenhelvete med MySQL och PHP

August 15th, 2012 | Posted by admin in Databas | Tips | Webbutveckling

Håller på och kodar på en ny sida (extentor.nu). Stötte på problemet att åäö-teckena visades som ett frågetecken. Jag har stött på problemet förr så jag brukar vara noga inför nya projekt att överallt använda UTF-8. För det här är en av de vanligast förekommande problemen, men ändå mest svårlösta problemen när man håller på med webbutveckling. Problemet kan sitta var som helst i kedjan mellan databasen till webbläsaren. Håller man tungan rätt i mun och kommer ihåg att sätta UTF-8 över allt så ska det inte vara något problem. Men nu fick jag alltså problemet ändå.

Jag startade ett omfattande felsökningsarbete där jag gick igenom hela kedjan från databasen och försäkrade mig att det på alla ställen stod UTF8. Men det löste inte problemet. Så jag började googla på det. Jag fick upp en del bra artiklar om problemet, men alla handlade uteslutande om att man råkat ha latin1 på ett ställe och UTF-8 på nåt annat ställe och hur man i sådana fall skulle kunna lösa problemet. En artikel som förtjänar ett hedersomnämnande är skrivet av hosting företaget Blue Box där de i detalj går igenom problemet och hur man löser det. En annan användbar källa verkar vara phpportalen där många har och har haft detta problem. Här finns en samlingstråd om detta problem. Och moderatorn marabou har skrivit en användbar checklista för vart problemet kan ligga. Men även artikeln från Blue Box och trådarna på phpportalen handlar främst om man att man råkat sätt latin1 på nåt ställe och UTF-8 på nåt annat ställe. Jag hade från början satt UTF-8 överallt och dubbelkollat att jag faktiskt gjort så.

En annan märklig grej var att åäö fungerande normalt på alla sidor förutom på en sida. Så jag började skriva ut åäö på olika sidor för att se var de fungerade och var de inte gjorde det. Denna godtyckliga strategi mynnade ut i att jag hittade problemet. Jag använde php-funktionen substr för att plocka ut en kortare del av kursnamnet och jag antar att substr inte har stöd för UTF-8, eller snarare för multibyte encoding. I php finns det en motsvarande funktion för substr som klarar av multibyte encodings. Den heter mb_substr. När jag använde denna funktion så löste det problemet.

Att det kan vara en php-funktion som inte klarar av multibyte encodings som är problemet är inget man tänker på direkt. Men det kan vara så och jag hoppas på att denna artikel besparar en del utvecklare en del huvudvärk.

You can follow any responses to this entry through the RSS 2.0 You can leave a response, or trackback.

Leave a Reply

Your email address will not be published. Required fields are marked *