UP11 site rollin' on yPHP

I-am dat drumul. Adică am trimis invitaţia, am pus sus site-ul şi informaţiile existenţiale, lucrurile se mişcă pe partea de logistică, lucrurile se mişcă pe partea de program, n-aş îndrăzni să zic că ne merge super dar avem loc de mişcare.

Site-ul îl puteţi vedea la http://www.unitatesiprietenie.ro/, şi este bazat pe yPHP. Tot setup-ul a durat una sau două ore, în condiţiile în care am gasit bug-uri prin structura yPHP ŞI am avut evident probleme cu encoding-ul. Mă înnebunesc problemele cu encoding-ul în ultima vreme, nu suport să nu fie textul cu diacritice şi întotdeauna fie baza de date fie PHP-ulş vrea să mess with me pe chestia asta.

Spre exemplu, pentru wiki-ul primitiv folosit de yPHP acum, imi trebuia un titlu unic pentru pagină, pe care îl gaseam, după moda Wiki (nu ştiu dacă mai ţine moda asta, da o fost aşa acum ceva vreme), cu toate cuvintele cu prima literă mare şi alăturate. Spre exemplu pagina „ONCR Festival cercetaşi” s-ar traduce în „OncrFestivalCercetaşi”.

Evident, o problemă aparent simplă. Doar că dacă faci ucfirst() pe un string care e encodat cu utf-8, rezultatul e un string pe encoding standard (nu ştiu exact care standard îi – poate cp1251, doar că nu ştie de caractere româneşti). Super, deci

ucfirst($string)

devine

mb_strtoupper(mb_substr($string, 0, 1, „utf-8”)).mb_substr($string, 1, strlen($string) – 1, „utf-8”).

That is in no way cool. Unde mai pui că suportul pentru mb_string în PHP e absolut opţional şi host-ul meu (care sunt români) nu îl are instalat. Deci no joy.

Acum câteva zile, tot probleme de encoding. De data asta, pe conexiunea MySQL. Atenţie pentru cine mai dă de probleme de genul ăsta. Dacă MySQL vă salvează diacriticele ca ? (semne de întrebare), sunt câteva chestii care le puteţi verifica.

1. MySQL are o drăcie care se numeşte collation, care e un atribut care se poate aplica până la nivel de coloană, şi ţine de encodingul folosit în coloanele respective. Atenţie, şi tabelul are proprietatea collation şi contează. Problema mea de ieri se întâmpla în contextul în care toate câmpurile tabelului erau pe utf8_general_ci, dar tabelul, care era proastpăt importat, era setat pe default-ul latin_sweedish_ci, care nu se înţelege deloc cu diacriticele.

2. Asiguraţi-vă că discuţia între server şi clientul vostru se face prin utf8. Sunt mai multe chestii în manualul MySQL despre cum se poate seta asta. Pentru că evident n-am avut chiar vreme (site-ul UP11 era trecut de deadline de muuult) să RTFM, am scanat prin el şi am găsit câteva linii relevante:

SET NAMES 'charset_name'
SET CHARACTER SET charset_name

Evident, nu trebuie să uitaţi să definiti character-encoding-ul în HTML-ul rezultat şi să trimiteţi headerul HTTP cu character encodingul setat corect (desi browserele de doamne-ajută fac ele detecţie).