![]() |
Konvertera UTF-8 till ISO-8859-1 med PHP
Hej alla,
jag har spenderat halva kvällen med att försöka få ordning på konvertering av strängar i PHP. Jag använder ett API som kräver att alla strängar skickas in som ISO-8859-1 och jag försöker därför få till det så att det blir så :) Problemet är bara att det går käpprätt åt he-vete. Vad jag än försöker med, utf8_decode mb_convert_encoding eller iconv så blir det inte rätt utan strängen blir t.ex. med iconv bara null, och den försvinner med de andra också. Finns det någon som har en bra ide om vad jag kan göra för fel? Är strängen inte UTF8 fast mb_detect_encoding säger så, kan den vara något annat? Tecknet som krånglar just nu är ü, men jag antar att det är lika med alla andra specialtecken. Tar tacksamt emot alla ideer. |
Försvinner hela strängen? I så fall gör du nog någonting fel på vägen. Har du testat att kontrollera strängens längd och ASCII-kod (ord) för tecknet/tecknen som felar?
Normalt sett brukar ju API:n kräva UTF-8 istället :) |
Tänk på att det finns många fler tecken i utf-8 än i iso-8859-1. Därför måste du använda antingen //TRANSLIT eller //IGNORE som argument till iconv annars är din kod dålig. Dessutom måste du veta vilken teckenkoding strängen är i, mb_detect_encoding gissar bara. Som tartareandesire är det bra att manuellt inspektera bytesen i strängen. Ex. är ü 0xc3 0xbc i utf-8, men 0xfc i unicode och iso-8859-1.
|
Kan det vara så att data först läggs i ett html-formulär som sedan skickas till API:et via webbläsaren med POST eller GET? Då måste den html-sidan vara kodad i ISO-8859-1 och du måste ange det med:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> Berätta annars mer i detalj om hur du gör, det är för svårt att gissa vad felet är. Skickar du data med cURL? Vilket API är det? I vilket steg blir texten null? Funkar det att plocka ut texten i en test.php och bara konvertera till ISO-8859-1 utan några andra beroenden? |
Just nu är det tyska som krånglar, och kör jag
acl(utf8_decode("Frachtgebühr"), mb_detect_encoding("Frachtgebühr", 'UTF-8')) där acl är en funktion som skriver ut datan till firebug-consolen så blir resultatet UTF-8: NULL Kan det vara nån serverinställning så det inte alls är UTF-8 eller nåt fast PHP påstår så? |
Skriv inte ut till Firebug, hur vet du att felet inte ligger där? Skriv ut till webbläsaren istället och kolla vilken teckenkodning som webbläsaren väljer. Prova att byta teckenkodning i webbläsaren till ISO-8859-1 (Latin-1) eller UTF-8. Någon av dem bör visa konstiga tecken.
Varifrån kommer data? Hur kommer det sig att du inte vet vilken teckenkodning data har? mb_detect_encoding fungerar tyvärr inte alltid, så du bör bara använda den i nödfall. |
Har samma problem som Reager. Suttit på problemet ett tag och det är dags att lösa det.
För min del så tar jag emot data genom $_POST, datan sätts sedan in i genererad XML och skickas sedan med cURL till en extern server som vill ta emot allting i ISO-8859-1. Jag har blivit tvungen att trixa med utf8_decode() och grejor för att tillfälligt få det att bli OK men resultatet har blivit att xml taggar går sönder. ö</NOTINT1> blir ü/NOTINT1> vilket gör att utskicket blir helt trasigt. Jag har satt <meta> tagen till iso-8859-1. Jag har satt xml till iso-8859-1 och jag har satt cURL taggen till iso-8859-1. Efter mängder av testande med mb_detect_encoding() har jag till sist kommit fram till att all $_POST data faktiskt genereras som iso-8859-1 (returnerar ASCII) SÅ LÄNGE det INTE innehåller åäö. Direkt fältet innehåller åäö så genererar mb_detect_encoding() UTF-8 istället. Hur tvingar jag den att alltid köra iso? Går det ej? Har försökt läsa mig in lite mer på detaljerna kring encoding. Erkänner att jag inte är en expert på ämnet och således kan det även vara anledningen till problemet. |
marcuslind: den data som du får från $_POST är uppenbarligen UTF-8. Det är ingen skillnad på ASCII och UTF-8 om bara bokstäverna a-z används.
Läs gärna min bloggpost för att förstå lite mer om teckenkodning, det är riktigt svårt att få sånt här rätt om man inte kan grunderna ordentligt: http://www.entreprenord.se/hur-funge...gentligen.html Kan du spara ned XML-strängen i en fil och titta på den med en textredigerare? Kolla vilken teckenkodning den tror att filen har. |
Hade samma strul förut, problemet var att mb_detect_encoding() gissar fel.
Jag löste det genom att använda följande funktion: Kod:
function is_utf8($str) if (is_utf8($instr)) $outstr=utf8_decode($instr); |
Citat:
Det jag vill göra är alltså att få formuläret att även skicka ÅÄÖ i ASCII; precis som du säger så går det med ISO-8859-1(?). Hur får jag formuläret att skicka det så? |
Alla tider är GMT +2. Klockan är nu 09:24. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson