You are on page 1of 7

Diacriticele pe web folosind PHP

Data publicarii: 13-09-2006 - Copyright © Iftode Viorel

Orice vorbitor de limba română care nu este analfabet este de acord că limba română se scrie cu
semne specifice, numite diacritice. Toate site-urile care au ca limbă implicită limba română, ar
trebui să permită folosirea diacriticelor, iar reprezentarea lor să fie cea corectă. Diacriticele limbii
române sunt Ă, Â, Î, Ş, Ţ şi perechile lor minuscule. A scrie fără diacritice poate duce la exprimări
ambigue ca de exemplu „un tanc de 12 ani”, „un roman nascut la Roma”. Cuvinte precum
„pamant”, „stiinta”, „samanta” nu există în limba română. În plus, lipsa diacriticelor într-un text
românesc denotă o gravă lipsă de profesionalism. La fel ca în alte limbi (franceza, germana,
maghiara etc.) şi în limba română scrierea fără diacritice este inacceptabilă.

Obiceiul unora de a scrie fără diacritice a apărut din greutatea cu care se redacta la calculator în anii
1980-1990, când trebuia făcut un efort considerabil pentru a introduce literele cu diacritice. Această
dificultate continuă din păcate pe alocuri şi azi, de exemplu furnizorul de servicii de poştă
electronică Yahoo nu dispune de o modalitate automată de afişare corectă a textelor româneşti.

Cum putem rezolva problema?


Toate site-urile româneşti, ar trebui să folosească codificarea Unicode

Cum putem scrie un cod php care să trimită ca output un text în care avem diacritice?
În primul rând trebuie să introduceţi următoarea linie în secţiunea head a fişierului php:

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

În al doilea rând trebuie ca fişierul php să fie salvat cu encoding UTF-8.


În cazul în care folosiţi Dreamweaver ca editor, este deajuns să selectaţi din Modify->Page
Properties->Title/Encoding->Encoding->Unicode(UTF-8), iar la Unicode Normalization Form
selectaţi None (secvenţa meta din head va fi automat scrisă).
În cazul în care folosiţi Notepad, secvenţa meta trebuie introdusă, iar la salvarea fişierului trebuie să
selectaţi la Encoding opţiunea UTF-8.

Ok, trecem tastatura în limba română şi scriem urmatorul cod:

Cod:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>
<?php
echo 'ă,î,â,ş,ţ,Ă,Î,Â,Ş,Ţ';
?>
</body>
</html>

De acum încolo puteţi fi siguri că outputurile cu diacritice vor fi reprezentate corect în browser.

Cum salvăm diacriticele în baza de date?


Ca exemplu o să folosim MySQL.
Pentru început o să creăm o bază de date numită “tutoriale”:

CREATE DATABASE tutoriale DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Observăm deci că gestionarea bazei de date se va face utf8_general_ci, iar setul de caractere
implicit pentru baza de date nou creată este utf8.
Creăm şi o tabelă numită “diacritice” ce va avea două câmpuri (cod_rand şi string):

CREATE TABLE diacritice (


cod_rand int(10) unsigned NOT NULL auto_increment,
string varchar(255) default 'mesaj implicit',
PRIMARY KEY (cod_rand))
ENGINE=InnoDB
DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;

Observăm că tabela este gestionată utf8_general_ci, iar setul de caractere implicit al acestei tabele
este utf8.

Se va crea fişierul introdu_tutorial.php care ne va ajuta să introducem text de maximum 255


caractere în tabela diacritice (fişierul se va salva cu encoding Unicode(UTF-8)). Conţinutul acestui
fisier este:

Cod:
<?php
if(isset($_POST['string'])
and !ctype_space($_POST['string'])
and htmlspecialchars(trim(stripslashes($_POST['string'])),ENT_QUOTES)<=255)
{
mysql_connect('localhost','user','parola');
mysql_select_db('tutoriale');
mysql_query("SET NAMES utf8");
$introdu_mesaj = mysql_query('INSERT INTO diacritice (string) VALUES
("'.htmlspecialchars(trim($_POST['string']),ENT_QUOTES).'")')
or die(mysql_error());
mysql_close();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Introdu tutorial</title>
</head>
<body>
<form method="post" action="introdu_tutorial.php">
Introdu string:
<input type="text" name="string" value="" maxlength="255" />
<input type="submit" value="Introdu in baza de date" />
</form>
</body>
</html>

Se va crea un alt fisier php cu denumirea citeşte_tutorial.php, care va citi conţinutul tabelei
diacritice. Conţinutul acestui fisier este:
Cod:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Cite&#351;te tabela</title>
</head>
<body>
<?php
mysql_connect('localhost','user','parola');
mysql_select_db('tutoriale');
mysql_query("SET NAMES utf8");
$interogare1=mysql_query('SELECT * FROM diacritice');
while($rezultat1=mysql_fetch_array($interogare1))
{
echo $rezultat1['cod_rand'].' - '.$rezultat1['string'].'<br />';
}
mysql_close();
?>
</body>
</html>

După ce aţi realizat baza de date şi aţi creat cele două fişiere, rulaţi scriptul introdu_tutorial.php.
Introduceţi în căsuţa text, un mesaj care să conţină şi diacritice (ex: Limba şi literatura română).
Accesaţi apoi citeste_tutorial.php.
Secvenţa mysql_query("SET NAMES utf8"); este necesară pentru ca extragerea datelor să se facă în
modul utf8.

O altă problemă des întâlnită la site-urile româneşti este aceea a căutării textelor scrise cu diacritice.
Mai exact, siteul este în limba română, iar conţinutul lui este scris folosind diacriticele. Site-ul are şi
o secţiune în care utilizatorii pot efectua căutări după anumite cuvinte cheie. Însă uneori utilizatorii
pot efectua căutări după cuvinte scrise cu sau fără diacritice. Programatorii trebuie să ia în
considerare şi acest lucru, iar căutarea să returneze rezultate după ambele formate ale cuvintelor
cheie (cuvinte scrise cu sau fără diacritice).
Să presupunem că introducem urmatoarele 4 mesaje în tabela diacritice (introducerea mesajelor se
va face folosind scriptul introdu_tutorial.php):

bancă de lemn
banca comercială
banca
bâncă

În general prin scripturile de căutare se găsesc interogari în genul (în exemplul dat se presupune că
se caută cuvântul “bancă”):

SELECT * FROM diacritice WHERE string LIKE '%bancă%';

Rezultatul acestei interogari va afişa toate cele 4 variante, lucru lăudabil dacă e să ne gândim că
utilizatorii pot introduce cuvinte cheie scrise cu sau fără diacritice. Însă ce ne facem dacă dorim să
se afişeze doar înregistrările care conţin cuvântul “bancă” (mai exact să se facă diferenţa între
diacritice şi literele care le înlocuiesc pe acestea). Soluţia este dată de tipul gestionării:

SELECT * FROM diacritice WHERE string LIKE '%bancă%' collate utf8_romanian_ci;


Rezultatul acestei interogari va fi doar înregistrarea care conţine cuvântul bancă.

Scrierea diacriticelor în fişiere.


Să presupunem că doriţi să scrieţi cu ajutorul php un fişier cu extensia .rtf care să conţină datele
coloanei string a tabelei diacritice.
Marea majoritate dintre cei ce citesc acest tutorial vor fi tentaţi să creadă că urmatorul cod va
răspunde cerinţelor:

Cod:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Scrie in fisier varianta gresita</title>
</head>
<body>
<?php
mysql_connect('localhost','user','parola');
mysql_select_db('tutoriale');
mysql_query("SET NAMES utf8");
$interogare1=mysql_query('SELECT * FROM diacritice');
$fo=fopen('tutorial.rtf','w');
while($rezultat1=mysql_fetch_array($interogare1))
{
$fw=fwrite($fo,$rezultat1['string'].'; ');
}
fclose($fo);
mysql_close();
?>
</body>
</html>

După execuţia scriptului, dacă vom deschide fişierul .rtf cu WordPad o să observăm că diacriticele
sunt reprezentate într-un mod nu tocmai dorit. Cauza presupun că o ştiţi, dar care să fie rezolvarea
în acest caz?

Cod:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Citeste tabela</title>
</head>
<body>
<?php
mysql_connect('localhost','user','parola');
mysql_select_db('tutoriale');
mysql_query("SET NAMES utf8");
$interogare1=mysql_query('SELECT * FROM diacritice');
$fo=fopen('tutorial.rtf','w');
while($rezultat1=mysql_fetch_array($interogare1))
{
$fw=fwrite($fo,iconv('utf-8', 'iso-8859-2',$rezultat1['string'].'; '));
}
fclose($fo);
mysql_close();
?>
</body>
</html>

Deci, soluţia este dată de funcţia iconv care ajută la convertirea unui string la o codificare dată.

Realizarea de documente pdf care să suporte diacriticele.


Limbajul php oferă posibilitatea de a crea documente pdf. PDF este un format arhicunoscut şi este
des folosit tocmai datorită avantajelor pe care le oferă, însă principalele două motive sunt
gratuitatea şi portabilitatea.
Personal cunosc două metode prin care se pot realiza documente pdf (care să suporte standardul
Unicode) folosind limbajul php. O metodă ar fi folosirea frameworkului celor de la Zend, însă
uneori rămâi cu un gust amar când întâlneşti “n” buguri iar codarea devine din ce în ce mai greoaie.
Cea dea doua metoda (cea pe care o recomand) ar fi folosirea clasei fpdf . Pe site găsiţi clasa
generatoare de pdf-uri, manual în limba română, chiar şi câteva scripturi ajutătoare.
Să facem şi noi un exemplu care să ajute la scrierea de text unicode într-un fişier pdf.

Cod:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Scrie pdf</title>
</head>
<body>
<?php
require_once('../framework/pdf/tcpdf.php');
$pdf = new TCPDF("P", "mm", 'A4', true);
$pdf->SetCreator("Fişier pdf realizat cu cod preluat din tutorialul
'Diacriticele pe web folosind PHP' - autor Iftode Viorel,
site tutorial: http://www.tutoriale.far-php.ro");
$pdf->SetAuthor("Fişier pdf realizat cu cod preluat din tutorialul
'Diacriticele pe web folosind PHP' - autor Iftode Viorel,
site tutorial: http://www.tutoriale.far-php.ro");
$pdf->SetTitle("Fişier pdf realizat cu cod preluat din tutorialul
'Diacriticele pe web folosind PHP' - autor Iftode Viorel,
site tutorial: http://www.tutoriale.far-php.ro");
$pdf->SetSubject("Fişier pdf realizat cu cod preluat din tutorialul
'Diacriticele pe web folosind PHP' - autor Iftode Viorel,
site tutorial: http://www.tutoriale.far-php.ro");
$pdf->SetKeywords("Fişier pdf realizat cu cod preluat din tutorialul
'Diacriticele pe web folosind PHP' - autor Iftode Viorel,
site tutorial: http://www.tutoriale.far-php.ro");
$pdf->SetHeaderData('', 0, "Fişier pdf realizat cu cod preluat din tutorialul
'Diacriticele pe web folosind PHP'", "Fişier pdf realizat cu cod preluat din
tutorialul
'Diacriticele pe web folosind PHP' - autor Iftode Viorel,
site tutorial: http://www.tutoriale.far-php.ro");

//set margins
$pdf->SetMargins(15, 20, 15);
//set auto page breaks
$pdf->SetAutoPageBreak(TRUE, 25);
$pdf->SetHeaderMargin(5);
$pdf->SetFooterMargin(10);
$pdf->setImageScale(4); //set image scale factor

$pdf->setHeaderFont(Array('FreeSerif', '', 10));


$pdf->setFooterFont(Array('FreeSerif', '', 8));

$pdf->setLanguageArray($l); //set language items

//initialize document
$pdf->AliasNbPages();
$pdf->AddPage();

mysql_connect('localhost','user','parola');
mysql_select_db('tutoriale');
mysql_query("SET NAMES utf8");
$interogare1=mysql_query('SELECT * FROM diacritice');
while($rezultat1=mysql_fetch_array($interogare1))
{
$pdf->Write(7,$rezultat1['string']."\n");
}
mysql_close();
$pdf->Output('tutorial.pdf','f');
?>
</body>
</html>

În folderul în care aţi creat scriptul php, după execuţie o să găsiţi un fişier pdf al cărui conţinut este
format din datele introduse în tabela diacritice. Nu uitaţi să specificaţi corect calea către clasa pdf
aşa cum o aveţi pe serverul dvs. (require_once('../framework/pdf/tcpdf.php');)

Atenţie, toate codurile prezentate în acest tutorial au fost realizate şi verificate pe MySQL 5.0.23 şi
PHP 5.1.4.