Note: J'ai lu tous les articles de codage de caractères PHP, UTF-8, qui sont généralement suggérés, mais ma question concerne les données insérées avant que j'applique de telles techniques. Je souhaite corriger rétrospectivement tous les problèmes d'encodage de caractères.Codages de chaîne incorrects
Maintenant toutes les connexions sont définies comme utf8 en utilisant PDO.
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
Malheureusement, une grande quantité de données a été inséré qui est de l'encodage douteux avant d'avoir mis en œuvre des pratiques de codage de caractères correct. Comme le montre par:
$sql = "SELECT name FROM data LIMIT 3";
foreach ($pdo->query($sql) as $row)
{
$name = $row['name'];
echo $name . "\n";
echo utf8_encode($name) . "\n";
echo utf8_decode($name) . "\n";
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "\n";
echo htmlspecialchars(utf8_encode($name), ENT_QUOTES, 'UTF-8') . "\n";
echo htmlspecialchars(utf8_decode($name), ENT_QUOTES, 'UTF-8') . "\n";
echo '<hr/>';
}
qui produit:
AntonÃÂn Dvořák
AntonÃÆÃÂn DvoÃâ¦Ãâ¢ÃÆák
Anton�?n Dvo�?�?�?¡k
AntonÃÂn Dvořák
AntonÃÆÃÂn DvoÃâ¦Ãâ¢ÃÆák
----------
Ô±Ö€Õ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿Ö€ÕµÕ¡Õ¶
ñÃâ¬Ã¡Ã´ ýáùáÿÃâ¬ÃµÃ¡Ã¶
Ա�?ամ Խաչատ�?յան
Ô±Ö€Õ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿Ö€ÕµÕ¡Õ¶
ñÃâ¬Ã¡Ã´ ýáùáÿÃâ¬ÃµÃ¡Ã¶
----------
Tiësto
Tiësto
Tiësto
Tiësto
Tiësto
Tiësto
----------
Lors de la suppression « SET NAMES utf8 » avec AOP elle produit les données, qui n'ont en fait les éléments corrects, bien que sur les différentes lignes:
AntonÃn DvoÅák
AntonÃÂn DvoÃÂák
Antonín Dvořák
AntonÃn DvoÅák
AntonÃÂn DvoÃÂák
Antonín Dvořák
----------
Արամ Խաչատրյան
Ô±ÖÕ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿ÖÕµÕ¡Õ¶
???? ?????????
Արամ Խաչատրյան
Ô±ÖÕ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿ÖÕµÕ¡Õ¶
???? ?????????
----------
Tiësto
Tiësto
Ti�sto
Tiësto
Tiësto
----------
Et voici une décharge des lignes de base de données concernée:
DROP TABLE IF EXISTS `data`;
CREATE TABLE IF NOT EXISTS `data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(80) NOT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`(10)),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;
INSERT INTO `data` (`id`, `name`) VALUES (0, 'AntonÃÂn Dvořák'), (1, 'Ô±Ö€Õ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿Ö€ÕµÕ¡Õ¶'), (2, 'Tiësto');
Les 3ème et 6ème lignes de la 3ème rangée "Tiësto" sont alors correctement répercutées. Je ne suis pas sûr quelle est la meilleure façon de corriger les encodages/détecter les encodages de mauvaises chaînes et corriger, etc
Ceci a été demandé mais IMO pas complètement répondu ici: http://stackoverflow.com/questions/1344692/i-need-help-fixing-broken-utf8-encoding (Ne pas voter comme doublon parce que ce * est * réparable) –
Dans un premier temps, pour confirmer: Êtes-vous sûr à 100% que vos données de base de données sont brisées? Qu'avez-vous utilisé pour faire la décharge?Un programme client tel que phpMyAdmin ou HeidiSQL affiche-t-il les caractères brisés lorsque vous parcourez la table? –
phpMyAdmin affiche ce qui est affiché sur la ligne supérieure. – James