WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Konvertera UTF-8 till ISO-8859-1 med PHP (https://www.wn.se/forum/showthread.php?t=1043742)

Reager 2010-09-08 22:50

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.

tartareandesire 2010-09-08 23:01

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 :)

Bjorne 2010-09-08 23:48

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.

cyner 2010-09-09 07:41

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?

Reager 2010-09-09 08:23

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å?

cyner 2010-09-09 08:33

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.

marcuslind 2010-09-10 14:40

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.

cyner 2010-09-10 16:06

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.

SimonP 2010-09-10 16:22

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)
{
 $c=0; $b=0;
 $bits=0;
 $len=strlen($str);
 for($i=0; $i<$len; $i++)
 {
        $c=ord($str[$i]);
      if($c > 128)
        {
        if(($c >= 254)) return false;
        elseif($c >= 252) $bits=6;
        elseif($c >= 248) $bits=5;
        elseif($c >= 240) $bits=4;
        elseif($c >= 224) $bits=3;
        elseif($c >= 192) $bits=2;
        else return false;
        if(($i+$bits) > $len) return false;
        while($bits > 1)
        {
            $i++;
            $b=ord($str[$i]);
            if($b < 128 || $b > 191) return false;
            $bits--;
        }
      }
  }
  return true;
}

Exempel:
if (is_utf8($instr)) $outstr=utf8_decode($instr);

marcuslind 2010-09-13 09:31

Citat:

Ursprungligen postat av cyner (Inlägg 20368989)
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.

Enligt mb_detect_encoding() så är olika fält ifrån formuläret olika encoding. De med ÅÄÖ är UTF-8 och de med A-Z är ASCII. Gissar den fel?

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