Corriger des caractères UTF-8 forcés
Certaines migrations de bases de données ne se passent pas bien, notamment à cause de l’encodage, et on se retrouve avec les caractères UTF-8 encodés sur 2 caractères directement en base : é en tant que caractère à et caractère ©, etc.
Voici un code que j’ai développé, avec l’aide de la classe phpQuery et de la fonction url_get_contents, qui est un appel cURL centralisé :
<!--?php
// Récupération de ce tableau depuis son URL
// (le code est externalisé de la fonction afin de ne l'appeler qu'une seule fois)
$utf8 = url_get_contents('http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=char&view=3');
// trim pour ne garder que le code dans la balise body
$utf8 = substr($utf8, strpos($utf8, '));
$utf8 = substr($utf8, 0, strpos($utf8, ') + 7);
$docUtf8 = phpQuery::newDocument($utf8);
// fonction qui va balayer le tableau pour le remplacement
function replaceUTF8($string) {
global $docUtf8;
foreach ($docUtf8['td.utf8'] as $cell):
if (trim(pq($cell)->text()) && trim(pq($cell)->prev()->text())):
$string = str_replace(trim(pq($cell)->text()), trim(pq($cell)->prev()->text()), $string);
endif;
endforeach;
return $string;
}
?>
Et le code pour TOUT repasser…
<?php //Tables $resultT = mysql_query("SHOW TABLES"); while ($rowT = mysql_fetch_array($resultT)): $table = $rowT[0]; echo "<h2>$table</h2>"; $id_field = AdminGetPrimaryCol($table); //Colonnes $tCols = array(); $resultC = mysql_query("SHOW FULL COLUMNS FROM " . $table); while ($rowC = mysql_fetch_array($resultC)): if ($rowC[0] != $id_field) $tCols[] = $rowC[0]; endwhile; //Update $result = mysql_query("SELECT * FROM $table"); while ($row = mysql_fetch_array($result)): foreach ($tCols as $colonne): $q = "UPDATE $table " . "SET $colonne='" . mysql_real_escape_string(replaceUTF8($row[$colonne])) . "' " . "WHERE $id_field=" . $row[$id_field]; echo "$q<br/>"; mysql_query($q); endforeach; endwhile; endwhile; ?>