Diacritice Pe Web Folosind PHP

9
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ă).

description

Diacritice Pe Web folosind PHP

Transcript of Diacritice Pe Web Folosind PHP

Page 1: Diacritice Pe Web Folosind PHP

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ă).

Page 2: Diacritice Pe Web Folosind PHP

Î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.

Page 3: Diacritice Pe Web Folosind PHP

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:

Page 4: Diacritice Pe Web Folosind PHP

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> <?phpmysql_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 lemnbanca comercialăbancabâ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;

Page 5: Diacritice Pe Web Folosind PHP

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> <?phpmysql_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> <?phpmysql_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))     {

Page 6: Diacritice Pe Web Folosind PHP

    $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> <?phprequire_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

Page 7: Diacritice Pe Web Folosind PHP

$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.