Script php permettant de traduire un texte codé en utf-8 en iso 8859.

PHP 

Lorsque l'on récupères des données externes que l'on intègre dans ses bases de données, un des principaux soucis relève de la gestion des accents. Si les données proviennent de votre site, la solution arrive vite.

Le problème est que lorsque l'on récupère des fichiers d'exports externes (catalogues, exports sql ou csv), nous n'avons pas forcément le choix.

Ce script ci-dessous vous permet de convertir un fichier. Il a été conçu pour être lancé en mode console (CLI). Vous devez créer un dossier export avec des droit d'écriture. Pour l'éxécuter taper php script.php nomdufichieradecoder). Si vous ne disposez pas de mode console, vous pouvez ajoutez les balises html et modifier la variable $file pour un mode web. le mode console a été choisi pour sa rapidité et pour éviter les time out dans le cas de fichiers volumineux.

Ceci est un exemple, n'hésitez pas à le modifier à vorte convenance :)

Voici une cette adaptation  afin de pouvoir traduire un fichier encodé en utf_8 :


<?php
//Ce script permet de convertir un fichier encodé en utf en8 iso
// LICENCE GPL
// Adapté de  http://w3.org/International/questions/qa-forms-utf-8.html

$file= isset($_SERVER['argv'][1]) ? urldecode($_SERVER['argv'][1]) : "no";

function convertUTF8_to_8859($str){ 
 // fonction qui teste si la chaine est encodé en UTF8
 if(is_utf8($str) == 1){ 
  // fonction qui teste si la chaine encodé en UTF8 contient des caractère français: Cette fonction ne traite que des chaines en UTF8
  if(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);
 }
}
// 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);
} // function is_utf8


// fonction qui cherche s'il ya des caractres accentus franais 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";
 }
}
if ($file!="no")
{
$fic = fopen($file, "rb");
$filedest="export/converti-".$file;
$ficdest = fopen($filedest, "w");
$marqueurdebut=0;
/*for ($ligne = fgetcsv($fic, 5024); !feof($fic); $ligne = fgetcsv($fic, 1024)) {
 
$nblignes=sizeof($ligne);
//echo "bvlignes=".$nblignes;*/
$i=0;
if (!$fic)
echo "Erreur fichier en ouverture";
else while (!feof($fic))
{
$ligne = fgets($fic, 3024);
$ligne2=convertUTF8_to_8859($ligne);

$ligne2=str_replace("Ã?","è",$ligne2);
$ligne2=str_replace("é","é",$ligne2);
$ligne2=str_replace("Ã","à",$ligne2);

fwrite($ficdest, $ligne2);
//echo $ligne2;
$i++;

}
}
else echo "\nnom de fichier incorrect\n (php script.php parametre)";
fclose($fic);
fclose($ficdest);
echo "\nFichier converti\n";
echo '\n\tLe fichier converti est le fichier :'.$filedest.'\n\n';
?>


Partagez et votez! Votez pour cet article et abonnez-vous sur les sites communautaires.
    fuzz funzz wikio blogmemes bluegger Scoopeo tapemoi twitter blogmarks co.mments connotea del.icio.us De.lirio.us digg Fark feedmelinks Furl LinkaGoGo Ma.gnolia NewsVine Netvouz RawSugar Reddit scuttle Shadows Simpy TailRank YahooMyWeb NewsGator