uneori trebuie si mai din topor

Inainte de toate, admit ca nu e prea frumos ce urmeaza sa prezint, nici ca idee, nici ca implementare, dar pledez pentru "temporary insanity", asta sa nu avem vorbe ;)

Problema cu care m-am confruntat e un site "pehaspe-maieschiuel", cu articole tinute in db, care suferea de clasica problema "s-au stricat diacriticele". La inceput mi-am zis, eh, am mai facut de-astea, un iconv bine plasat pe dumpul initial, import si alter tables, dupa care ta-da!

Ntz. Site-ul suferise de vreo doua astfel de migrari, plus diversi destepti care au "reparat", plus editori diferiti, plus copy-paste din word (cu bulinute, smart-quotes, em-dashes, ellipsis, samd). Caracterele cu diacritice erau in vreo trei forme diferite, asa ca nu puteam gasi o solutie generica. Ca atare am facut un script care sa inlocuiasca diversii "viermisori" cu lucruri mai normale. Eu am transformat totul la ascii pentru ca oricum aveam mai bine de jumatate din texte scrise fara diacritice si am zis ca nu ma mai complic degeaba. Scriptul pe care l-am folosit de fapt e ceva mai complicat pentru ca scormoneste prin DB si imi da si contextul in care gaseste caractere necunoscute, pentru a completa hashul, plus ca face si update.

Am produs pana la urma doua hash-uri, pentru a forta precedenta intre cateva substituiri, dau mai jos hashurile folosite si cum se pot utiliza (pentru a preveni "false friends" cauzati de diversele transformari RSS-friendly, recomand downloadul direct, intrucat contine caractere UTF-8 multibyte si cateva caractere html-encoded):

my %changes = (
 'ş' => 's',
 'Ş' => 'S',
 'ţ' => 't',
 'Ţ' => 'T',                                               
 'ă' => 'a',                                               
 'Ă' => 'A',                                               
 '–'    => '-',                                                 
 '…'    => '...',                                               
 'î'     => 'i',                                                
 'Î'     => 'I',                                                
 'â'     => 'a',                                                
 'Â'     => 'A',
 '“'    => '"',
 '”'    => '"',
 '„'    => '"',                                                 
 '¬' => '',
 '‘’' => '"',
 '’’' => '"',
 '’' => '\'',
 '‘' => '\'',                                                   
 ## these two might deserve a <ul>                              
 '•' => '*',
 "\x95" => '*',
 "a\xA2" => 'a',
 "\xE2" => 'a',
 "\xEE" => 'i',                                                 
 "\xCE" => 'i',                                                 
 "\x84" => '"',
 "\x85" => '...',                                               
 '½' => '1/2',
 '«' => '"',
 '»' => '"',                                                    
);          

my %changes2 = (                                                   
 "\x93" => '"',
 "\x94" => '"',                                                 
);          
## sometime later...
 for ( keys(%changes) ) {
 $text =~ s/$_/$changes{$_}/gs;
 }
 for ( keys(%changes2) ) {
 $text =~ s/$_/$changes2{$_}/gs;
 }

Probabil ca gaseam cateva module care rezolvau treaba asta mai elegant, dar cum spuneam, I plead temporary insanity. Mai am cateva dude pe care n-am reusit sa le identific corect, dar deocamdata a functionat. Daca vreun webdeveloper citeste chestia asta, e rugat frumos (dar printre dinti) sa foloseasca utf-8 peste tot, de la baza de date la encodingul paginii. Kthx.

Comments are closed.