UTF-8 in paginile web (diacritice, caractere speciale, suport multilingv)

Average: 4.2 (25 votes)

Se poate sa fi intampinat dorinta/nevoia de a include in paginile voastre suport pentru alte limbi in afara de romana. In acest caz apare problema afisarii caracterelor speciale, diacriticelor ce sa mai vorbim de alfabetul chirilic sau de limbile arabe/asiatice, etc.

ISO 8859-1

Pentru majoritatea limbilor latine, problema este rezolvata din start, datorita standardului ISO 8859-1 care este standardul implicit utilizat de majoritatea editoarelor HTML.

Definirea tipului de caractere ce urmeaza a fi afisat in pagina HTML se face prin specificarea unui set de caractere (charset) pentru atributul Content-Type al unui tag meta:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Standardul ISO 8859-1 acopera Alfabetul Latin Numarul 1 care contine 191 caractere din sistemul de scriere latin. Printre limbile europene mai raspandite, acoperite de acest standard, se numara: Engleza, Germana, Italiana, Spaniola, Portugheza, Daneza, Suedeza, Norvegiana, etc.

ISO 8859-2

Alfabetul Latin Numarul 1 insa, nu contine toate caracterele aferente limbii romane (adica ? si ?). Pentru a afisa in pagina HTML texte cu suport 100% pentru caracterele romanesti cu diacritice, este nevoie sa definiti setul de caractere:

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">

Acest standard poarta si denumirea de Alfabetul Latin Numarul 2 (sau Latin-2) si este o versiune extinsa a lui ISO 8859-1, care ofera suport pentru toate caracterele acestuia, si cateva noi in plus.

Urmatoarele alfabeturi sunt suportate 100% de acest standard: Romana, Maghiara, Sarba, Slovena, Slovaca, Ceha, Poloneza, si altele.

UTF-8

In cazul in care seturile de caractere de mai sus nu va acopera toate caracterele de care aveti nevoie la afisarea in pagina HTML, ar trebui sa va indreptati privirea spre UTF-8.

UTF-8 este o metoda de codare a caracterelor cu lungime variabila, si foloseste 1 pana la 4 octeti pentru reprezentarea unui caracter:

  • 1 octet pentru codul US-ASCII (care contine caracterele de baza ale alfabetului englezesc)
  • 2 octeti pentru alfabetul latin, cu toate caracterele cu diacritice, dar si caractere din Greaca, Chirilica, Araba, si altele
  • 3 octeti pentru ceea ce se numeste Basic Multilingual Plane (BMP) care este "stratul" de baza al Unicode-ului, care practic suporta toate alfabeturile moderne, plus unele caractere speciale. Cea mai mare parte o ocupa suportul pentru Chineza, Japoneza si Coreeana.
  • 4 octeti pentru celelalte "straturi" ale Unicode-ului, si pentru anumite caractere speciale, care sunt rar utilizate in practica.

Definirea unui set de caractere codat in UTF-8 pentru o pagina HTML se face in felul urmator:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Ca totul sa functioneze cum trebuie, este necesar ca pagina HTML sa fie si ea la randul ei codata in UTF-8. Acest lucru se seteaza din editorul de text pe care il folositi la crearea paginii HTML. Unele editoare moderne, au setat implicit modul de codare in UTF-8. Pentru editoare mai vechi, este nevoie sa cautati prin setari (Options, Properties) optiuni de codare a paginilor care le editati (Page/Document Enconding), sau alte la editoare puteti specifica tipul de codare in momentul in care salvati (Save/Save As).

In cazul in care editorul nu suporta fisiere codate UTF-8, sau nu gasiti setarea respectiva, puteti utiliza editorul Eclipse care este Open-Source.

UTF-8 si PHP

In cazul in care lucrati cu limbaje server-side (PHP, ASP, JSP, CF) si aveti de a face cu suport pentru mai multe limbi intr-un site web, textele ce urmeaza sa fie afisate in site probabil le pastrati separat de site, unde le definiti in functie de limba si doar le includeti in fisierele site-ului.

In acest caz, pasul de mai sus (definirea setului de caractere) este necesar, dar pe langa asta, fisierele PE CARE pe includeti trebuie sa fie codate in UTF-8, nu neaparat si fisierul IN CARE le includeti.

Asadar, fisierele unde pastrati informatia trebuie sa fie codate/salvate in UTF-8, si fisierele care le afisati in browser, trebuie sa aibe setat setul de caractere pentru UTF-8.

In loc de tagul meta pentru definirea setului de caractere, in PHP puteti folosi si urmatoarea metoda:

<?php header("Content-type: text/html; charset=utf-8");?>

ATENTIE! Codul de mai sus trebuie sa fie scris inainte de orice alt caracter HTML sau inainte de orice alt cod PHP care face "output" (care "scrie pe ecran"). Atentie si la spatiile libere, sau randuri goale.

UTF-8 si MySQL

Mergand mai departe, si in cazul bazelor de date, trebuie specificat suportul pentru UTF-8. In primul rand, este nevoie sa setati baza de date ca avand continut UTF-8. MySQL, incepand de la versiunea 4.1, oferta suport puternic pentru Unicode, si in consecinta si pentru UTF-8.

De obicei, MySQL lucreaza in mod implicit cu setul de caractere (denumit COLLATION in MySQL) latin1_swedish_ci pe care va trebui sa-l inlocuiti cu utf8_general_ci.

Acest lucru il puteti face fie printr-o interfata MySQL (phpMyAdmin, de exemplu, care este un script PHP ce face interfatarea cu serverul de MySQL) fie prin interogari:

Pentru modificarea bazei de date:

ALTER DATABASE `database_name`
	CHARACTER SET utf8
	DEFAULT CHARACTER SET utf8
	COLLATE utf8_general_ci
	DEFAULT COLLATE utf8_general_ci;

Pentru modificarea unei tabele:

ALTER TABLE `table_name`
	DEFAULT CHARACTER SET utf8
	COLLATE utf8_general_ci;

Pentru modificarea din phpMyAdmin, dupa selectia bazei de date din selectul din stanga, click pe Operations din meniul de sus. Ultima optiune este Collation, care trebuie setat pe utf8_general_ci. Click pe Structure, si se vor afisa toate tabelele. Campul Collation ne spune ce set de caractere este definit. Daca nu este setat pe utf8_general_ci, trebuie sa o facem manual. Selectam o tabela, Click pe Operations, si setam Collation-ul corespunzator. Din pacate nu se poate aceasta modificare pe mai multe tabele deodata.

Dupa ce am setat baza de date si toate tabelele, trebuie sa setam si toate campurile de text care pot contine caractere UTF-8, si anume campurile de tip VARCHAR, CHAR, TEXT, TINYTEXT, MEDIUMTEXT, LONGTEXT, BLOB, TINYBLOB, MENIUMBLOB, LONGBLOB.

ATENTIE! trebuie setata atat baza de date, cat si toate tabelele care contin texte cu caractere UTF-8, cat si toate campurile din toate tabelele care contin texte cu caractere in UTF-8.

UTF-8 si PHP + MySQL

In cazul in care este vorba de o sectiune de administrare a unui site folosind formulare HTML si scripturi PHP care introduc informatii intr-o baza de date MySQL este nevoie ca si toata transmisia de date intre PHP si MySQL sa se efectueze conform coding-ului UTF-8.

Asadar, este nevoie sa adaugati urmatoarele linii in .htaccess:

# Set httpd charset to utf-8
AddDefaultCharset On
AddDefaultCharset utf-8
 
# Set php charset to utf-8 and setup mbstring
# Note: mbstring might not exist on all hosts
php_value default_charset utf-8
php_value mbstring.internal_encoding utf-8
php_value mbstring.func_overload 7

Pentru cei ce nu stiu, .htaccess este un fisier care trebuie sa stea in root-ul site-ului, care trebuie sa se numeasca exact asa cum se vede scris adica [.htaccess], fara extensie. Acest fisier poate contine comenzi de configurare a serverului specifice fiecarui site in parte.

Deasemenea, toate fisierele care contin formulare, in care se pot introduce texte in UTF-8, trebuie deasemenea sa aibe setate Content-Type-ul aferent:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

In acest mod aveti un sistem complet de colectare de date, transmisie de date, stocare de date si afisare de date pentru orice tip de caractere uzuale in format UTF-8.

Tags: