Kom ihåg mig?
Home Menu

Menu


Konvertera UTF-8 till ISO-8859-1 med PHP

 
 
Ämnesverktyg Visningsalternativ
Oläst 2010-09-08, 22:50 #1
Reager Reager är inte uppkopplad
Medlem
 
Reg.datum: Aug 2007
Inlägg: 151
Reager Reager är inte uppkopplad
Medlem
 
Reg.datum: Aug 2007
Inlägg: 151
Standard 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.
Reager är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-08, 23:01 #2
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
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
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-08, 23:48 #3
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
Bjorne Bjorne är inte uppkopplad
Flitig postare
 
Reg.datum: Sep 2009
Inlägg: 374
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.
Bjorne är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-09, 07:41 #4
cyners avatar
cyner cyner är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 74
cyner cyner är inte uppkopplad
Medlem
cyners avatar
 
Reg.datum: Jun 2006
Inlägg: 74
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?
cyner är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-09, 08:23 #5
Reager Reager är inte uppkopplad
Medlem
 
Reg.datum: Aug 2007
Inlägg: 151
Reager Reager är inte uppkopplad
Medlem
 
Reg.datum: Aug 2007
Inlägg: 151
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å?
Reager är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-09, 08:33 #6
cyners avatar
cyner cyner är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 74
cyner cyner är inte uppkopplad
Medlem
cyners avatar
 
Reg.datum: Jun 2006
Inlägg: 74
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.
cyner är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-10, 14:40 #7
marcuslind marcuslind är inte uppkopplad
Medlem
 
Reg.datum: Aug 2009
Inlägg: 188
marcuslind marcuslind är inte uppkopplad
Medlem
 
Reg.datum: Aug 2009
Inlägg: 188
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 är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-10, 16:06 #8
cyners avatar
cyner cyner är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 74
cyner cyner är inte uppkopplad
Medlem
cyners avatar
 
Reg.datum: Jun 2006
Inlägg: 74
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.
cyner är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-13, 09:31 #9
marcuslind marcuslind är inte uppkopplad
Medlem
 
Reg.datum: Aug 2009
Inlägg: 188
marcuslind marcuslind är inte uppkopplad
Medlem
 
Reg.datum: Aug 2009
Inlägg: 188
Citat:
Ursprungligen postat av cyner Visa inlägg
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å?
marcuslind är inte uppkopplad   Svara med citatSvara med citat
Oläst 2010-09-13, 10:04 #10
cyners avatar
cyner cyner är inte uppkopplad
Medlem
 
Reg.datum: Jun 2006
Inlägg: 74
cyner cyner är inte uppkopplad
Medlem
cyners avatar
 
Reg.datum: Jun 2006
Inlägg: 74
Citat:
Ursprungligen postat av marcuslind Visa inlägg
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?
mb_detect_encoding() och andra funktioner kan inte ta reda på vilken teckenkodning som faktiskt har använts, den kan bara gissa baserat på de tecken som den ser. Om exempelvis en sträng är tom, hur ska den veta vilken teckenkodning som använts?

Alltså är det bästa att fråga sändaren vilken teckenkodning som används, allt annat riskerar att gå fel, som det gör för dig.

Om du läser på om teckenkodning (exempelvis på min blogg, som jag föreslog), så förstår du att en sträng med a-z både kan tolkas som ASCII, ISO-8859-1, Windows 1252, UTF-8 och andra teckenkodningar. Det spelar ingen roll för dessa tecken, alltså är mb_detect_encoding() helt meningslös i dessa fall.

Och eftersom mb_detect_encoding() i ditt fall säger UTF-8 för vissa fält, kan du utgå från att det är UTF-8 som används och inget annat. Men det kräver förstås att inte källan byter teckenkodning.

Citat:
Ursprungligen postat av marcuslind Visa inlägg
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å?
(Strunta i ASCII, du vill ju ha ISO-8859-1, och det är inte samma sak. ASCII innehåller inte åäö.)

Konvertera indata från UTF-8 till ISO-8859-1 och skicka. Har du provat det?
cyner är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 09:47.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017