#1 před 2 lety

kravčo
Moderator
Registrovaný: 15. 6. 2008
Příspěvky: 791

iconv – podivné správanie

Vcelku ma zaujalo správanie iconv, pri konverzii latin2 → utf-8. Kód iconv('latin2', 'utf-8', "\x80") totiž nevygeneruje žiadny Notice: aj keď 0x80 nie je platný znak v latin2. Podobné konverzie, ako napríklad iconv('latin2', 'cp1250', "\x80") alebo iconv('latin2', 'ascii', "\x80") však Notice: vygenerujú.

Máte tušenie čím to môže byť? Mám iconv implementáciu glibc 2.9.

iconv('latin2', 'utf-8', "\x80");  // nič
iconv('latin2', 'cp1250', "\x80"); // Notice:
iconv('latin2', 'ascii', "\x80");  // Notice:

 

#2 před 2 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5548

Re: iconv – podivné správanie

Pod libiconv 1.11 to stejné. Taky tomu moc nerozumím. Podobně divně se chovají i některé znaky, které nejsou dostupné v UTF-8.

 

#3 před 2 lety

kravčo
Moderator
Registrovaný: 15. 6. 2008
Příspěvky: 791

Re: iconv – podivné správanie

Trochu som sa do toho pozrel a zdá sa, že to mám.

Štandard ISO/IEC 8859 obsahuje všetky kódové sady ISO/IEC 8859-* (1–16). Tieto kódové sady neobsahujú kontrolné znaky C0 (0x00-0x1F), DEL (0x7F) ani C1 (0x80-0x9F). Avšak IANA preferuje mená ISO-8859-* pre štandardizované sady s pridanými kontrolnými znakmi.

Podľa mojej logiky to teda znamená, že ak máme string "\x80" a to, že pri konverzii latin2utf-8 Notice: nevybehne je v poriadku a to, že pri konverzii latin2cp1250 Notice: vybehne je v poriadku tiež.

Akurát správa „Detected an illegal character in input string“ znamená niekedy to a niekedy ono… Niekedy, že vo vstupnom reťazci sa nachádza znak, ktorý v zdrojovom kódovaní vôbec neexistuje a inokedy, že síce v zdrojovom kódovaní existuje, ale nemá náprotivok v kódovaní cieľovom.

// "\x80" v cp1250 je symbol eura (v latin2 sa symbol eura nenachádza)
iconv('cp1250', 'latin2', "\x80");            // Notice:
iconv('cp1250', 'latin2//TRANSLIT' , "\x80"); // OK
iconv('cp1250', 'utf-8', "\x80");             // OK
iconv('cp1250', 'cp1250', "\x80");            // OK
// "\x81" je znak, ktorý v cp1250 nie je obsadený
iconv('cp1250', 'latin2', "\x81");            // Notice:
iconv('cp1250', 'latin2//TRANSLIT' , "\x81"); // Notice:
iconv('cp1250', 'utf-8' , "\x81");            // Notice:
iconv('cp1250', 'utf-8//IGNORE' , "\x81");    // Notice:
iconv('cp1250', 'cp1250', "\x81");            // Notice:

Keby ste nevedeli (ako ja dodnes), že neplatí iso-8859-* = latin*:

iso-8859-1  ~ latin1
iso-8859-2  ~ latin2
iso-8859-3  ~ latin3
iso-8859-4  ~ latin4
; pozor zmena...
iso-8859-9  ~ latin5
iso-8859-10 ~ latin6
; pozor zmena...
iso-8859-13 ~ latin7
iso-8859-14 ~ latin8
iso-8859-15 ~ latin9
iso-8859-16 ~ latin10

Štandard totiž obsahuje i iné ako latinské kódovania…

Editoval kravčo (20. 8. 2009 2:28)

 

#4 před 2 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: iconv – podivné správanie

Pěkné, díky za shrnutí!

 

Zápatí