Convertirea UTF-8 – ISO-8859-2


Poate nu aş fi scris acest material dacă respectiva problemă nu mi-ar fi consumat – inutil! prosteşte! – multe ore. (Rog super-experţii în PHP să râdă în altă parte.) Concret? Ca mai toţi webmasterii români, siturile pe care le fac folosesc unul dintre următoarele două encoding-uri: ISO-8859-2 (cunoscut şi ca Latin-2; l-am folosit ani de zile, cel mai adesea) sau UTF-8 (sincer, doar de când cu WordPress m-am văzut nevoit să îl folosesc). Problema a apărut în clipa în care am dorit să preiau conţinutul dintr-un encoding în alt encoding. Astfel, dacă într-o pagină cu encoding ISO-8859-2 iau ceva dintr-o tabelă cu encoding UTF-8, obţin ceva ca mai jos (e imagine):

image

Iată codul:

[PHP]


De test

Şarpe, ţânţar…

Ultimele articole:

    „.$row[‘post_title’].”

    „;
    ?>

[/PHP]

Bun. Ce soluţii sunt? PHP oferă un instrument: e vorba de funcţiile utf8_encode şi utf8_decode. Problema este că această funcţie se ocupă de ISO-8859-1, nu de ISO-8859-2 (normal, vesticii îşi văd de-ale lor în primul rând). Şi atunci ce este de făcut? Soluţia absolut primitivă pe care am folosit-o mai mult timp a fost să iau codul “urât” de mai sus şi să fac un replace (mai exact, în Notepad++ scriam ş în ambele encoding-uri, şi la fel pentru toate diacriticele). Mi-am scris cu alte cuvinte o funcţie proprie special pentru diacritice, care a mers cu succes până când am ajuns la texte ce în afară de diacriticele româneşti aveau şi alte caractere speciale. Sau căutam să prevăd toate cazurile speciale, sau trebuia o altă metodă.

Am săpat pe internet să văd cum fac alţii. Spre surprinderea mea am găsit că şi alţi răsăriteni (polonezi şi de alte naţiuni) mergeau pe o cale asemănătoare. Unii furnizau funcţii similare de convertire ISO-8858-2 în UTF-8 (sau invers), dar de fapt erau specializate pe caracterele specifice ţării respective. Cu alte cuvinte tot limitate. După îndelungi săpături, un comentariu de pe PHP.net m-a luminat. Funcţia utf8_encode este un caz particular al funcţiei iconv. Numele funcţiei mie mi-ar fi sugerat că face ceva cu iconiţe mai degrabă… Dar de fapt funcţia ia ca parametru encoding-ul de intrare, cel de ieşire şi textul cu pricina. În codul de mai sus, ca totul să arate OK, trebuie schimbat doar o linie. Linia 20 mai exact. Cu:

[PHP]echo „

  • „.iconv(„UTF-8″,”ISO-8859-2″,$row[‘post_title’]).”
  • „;[/PHP]

    Cu această linie afişarea e perfectă. Pagina ISO-8859-2 afişează fără probleme texte ce vin dintr-o tabelă cu encoding-ul UTF-8. Şi uite aşa, funcţia pe care o scrisesem s-a dovedit inutilă, existând o funcţie PHP care face mai bine treaba. Sper că va fi de folos şi altcuiva! Nu sunt atât de rare cazurile în care trebuie să faci o „comunicare” între cele două encoding-uri.


    Apreciază articolul:

    1 stea2 stea3 stea4 stea5 stea (6 evaluări, media: 4,67 din 5)
    Loading...Loading...

    6 comentarii

    1. bedexe spune:

      Excelent… ca ai publicat gaselnita ca altii sa nu mai piarda alte ore.

    2. sorin spune:

      Articolul tău este binevenit dar din păcate uită să explice utilizatorilor avantajele utilizării Unicode (UTF-8).

      Pe scurt ar trebui adăugat că poți face conversie de la ISO-8859-* către UTF-8 fără pierderi dar invers nu.

      La ora actuală nu aș mai recomanda nimănui să folosească pe web altceva decît UTF-8

      Am scris și un articol legat de asta, dar din păcate e doar în engleză: http://blog.i18n.ro/web-content-character-encodings-code-pages-and-utf-8-unicode/

    3. radu.capan spune:

      Mulţumesc de completări. Interesul meu a fost strict să subliniez funcţia iconv, dar desigur mai erau şi alte lucruri de evidenţiat.

    4. ov1d1u spune:

      Hehe, thanks for that. :) Multumita tie, am gasit rezolvarea problemei mele in doar 15 secunde.

    5. Petru Burac spune:

      Super multumesc.

      Eu am cautat vreo ora rezolvarea.
      Am avut nevoie pentru ca iau un xml de la http://openapi.ro, care e in UTF-8 şi ajunsesem să descopar funcţia iconv.
      Tot ce am avut nevoie şi mi-ai oferit clar e sa folosesc ISO-8859-2 în loc de ISO-8859-1.

    6. kimi spune:

      Multumesc pentru raspuns, eu am sapat mult mai adanc pana sa gasesc solutia. In cazul meu conversia care trebuia facuta era din ISO-8859-2 in UTF-8 si m-am chinuit multe ore cu utf8encode si tot felul de functii custom.


    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *