Traitement PHP lors de la restitution de l'encodage des caractères
De Typo3 CMS / Documentation Typo3 / Support Typo3.
Sommaire |
Introduction
Si le traitement de l'encodage des caractères de la base de données n'est pas fait au niveau de mysqldump, il existe une possibilité pour traiter l'affichage des caractères en PHP, voici les fonctions :
Fonction Convert UTF-8 to ISO8859-1
<?php function convertUTF8_to_8859($str) { // fonction qui test si la chaine est encodé en UTF8 if($this->is_utf8($str) == 1) { // fonction qui test si la chaine encodé en UTF8 contient des caractère français: Cette fonction ne traite que des chaines en UTF8 if($this->content8859_in_UTF8($str)=="TRUE") { // On convertit la chaine de UTF8 en ISO8859-1 $str = utf8_decode($str); // retourner la chaine converti return($str); }else{ // cas ou la chaine en UTF-8 mais ne contient pas des accents français (é,é,à,ù,û......) : exemple les caractères chinois encodé en UTF8 // retourner la chaine non convertit return($str); } }else{ // cas ou la chaine n'est pas encodé en UTF8 return($str); } } ?>
Fonction qui teste la présence de caractères français dans une chaine
<?php // fonction qui cherche s'il ya des caractères accentués français dans une chaine en UTF8 function content8859_in_UTF8($str) { if ( strlen($str) == 0 ) { return; } // cette fonction ne retourne de valeur si la chaine est en UTF8 // cette fonction retourne un tableau contenant les chaines accentuées preg_match_all('/.{1}|[^\x00]{1,1}$/us', $str, $ar); $chars = $ar[0]; $str_fr = 0; foreach ( $chars as $i => $c ) { $ud = 0; // Calcul les codes ASCII des chaines en UTF8 if (ord($c{0})>=0 && ord($c{0})<=127) { continue; } // ASCII - next please if (ord($c{0})>=192 && ord($c{0})<=223) { $ord = (ord($c{0})-192)*64 + (ord($c{1})-128); } if (ord($c{0})>=224 && ord($c{0})<=239) { $ord = (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128); } if (ord($c{0})>=240 && ord($c{0})<=247) { $ord = (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128); } if (ord($c{0})>=248 && ord($c{0})<=251) { $ord = (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128); } if (ord($c{0})>=252 && ord($c{0})<=253) { $ord = (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128); } if (ord($c{0})>=254 && ord($c{0})<=255) { $chars{$i} = $unknown; continue; } //error //Test si les caractères contient les accents (à, é,è,ù,ç,ê,â,û,........) if(($ord == 224) || ($ord == 226) || ($ord == 235) || ($ord == 249) || ($ord == 250) || ($ord == 252) || ($ord == 251) || ($ord == 233) || ($ord == 234) || ($ord == 232) || ($ord == 231) || ($ord == 228) || ($ord == 256) || ($ord == 128) || ($ord == 156) || ($ord == 230) || ($ord == 231) || ($ord == 244) || ($ord == 225) || ($ord == 236) || ($ord == 227) || ($ord == 237) || ($ord == 238) || ($ord == 249) || ($ord == 239) || ($ord == 257)){ $str_fr =1; } } if($str_fr == 1) { return "TRUE"; }else{ return "FALSE"; } } ?>
Fonction qui teste si le texte est en UTF-8
<?php // Returns true if $string is valid UTF-8 and false otherwise. function is_utf8($string) { // From http://w3.org/International/questions/qa-forms-utf-8.html return preg_match('%^(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )*$%xs', $string); } ?>
