PHP fóra: Builder | JakPsatWeb | Webtrh
Nejste přihlášen(a)
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:
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.
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 latin2 → utf-8
Notice: nevybehne je v poriadku a to, že pri konverzii
latin2 → cp1250 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)