Notez que cet article a été écrit il y a plus de 3 ans, mais il n'est pas forcément obsolète.
Certains problèmes d’encodage de caractères peuvent se produire lors d’import massif de bases de données (anciennes), où la conversion avec un nouveau schéma de caractères se passe mal.
Voici, par exemple, un extrait d’enregistrement d’une table obtenue par conversion d’un site SPIP vers wordPress.
1 |
N’hésitez pas à publier vos préparations sur le site des Clionautes, et dans le groupe. Ce travail ne peut qu’être bénéfique, pour vous et pour la communauté. \n\n\nPour conclure, n’oubliez pas que le concours est une épreuve de longue haleine (12 mois). C’est donc un marathon, et l’essentiel est d’aller jusqu’au bout, en conservant moral et confiance. Ne vous découragez pas face aux difficultés. Si cela arrive (et statistiquement cela arrive), respirez, reposez vous un peu et repartez de plus belle. Après les écrits, continuez à travailler les oraux quoi qu’il arrive car le jeu des coefficients fait la part belle à l’oral. Il faut donc y consacrer du temps. \n\n\nBon courage à toutes, et à tous. Que l’esprit et la force de l’Education Nationale soient avec vous !\n\n\nA l’œuvre !\n\n\n','Se préparer aux concours d\'histoire-géographie (sites, méthode, organisation)' |
On remarque la présence de caractères étranges tel que qu’être
, alors que cela aurait dû être interprété comme qu’être
.
Le tableau php array()
suivant montre les caractères dans ISO 8859-1 (ou Windows-1252) de 128 à 255 (hex 80 à FF). Le tableau permet de faire une conversion entre le caractère attendu UTF-8 et les caractères correspondants comme s’ils étaient des caractères ISO 8859-1. Vous pouvez utiliser ce tableau pour déboguer des problèmes où ces séquences de caractères latins se produisent, où un seul caractère était attendu. Le problème est provoqué par des octets UTF-8 interprétés comme des octets ISO 8859-1 (ou Windows-1252).
La moulinette de utf8_decode()
peut fonctionner mais il y aura des problèmes car les deux interprétations de caractères sont présents dans la chaîne. De même avec iconv()
ou mb_convert_encoding()
, même en spécifiant la constante //IGNORE
pour ignorer les caractères qui ne peuvent être représentés.
Voici ce que donne une conversion telle que iconv( "UTF-8", "ISO-8859-1//IGNORE", $string );
.
1 |
Ne vous découragez pas face aux difficultés. Si cela arrive (et statistiquement cela arrive), respirez, reposez vous un peu et repartez de plus belle. Après les écrits, continuez à travailler les oraux quoi qu�il arrive car le jeu des coefficients fait la part belle à l�oral. Il faut donc y consacrer du temps. Bon courage à toutes, et à tous. Que l�esprit et la force de l�Education Nationale soient avec vous ! A l��uvre ! ','Se pr�parer aux concours d\'histoire-g�ographie (sites, m�thode, organisation) |
Une solution consiste à convertir les caractères à l’aide du tableau de conversion suivant.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
<?php $new2old = array( 'á' => 'á', 'À' => 'À', 'ä' => 'ä', 'Ä' => 'Ä', 'ã' => 'ã', 'å' => 'Ã¥', 'Å' => 'Ã…', 'æ' => 'æ', 'Æ' => 'Æ', 'ç' => 'ç', 'Ç' => 'Ç', 'é' => 'é', 'É' => 'É', 'è' => 'è', 'È' => 'È', 'ê' => 'ê', 'Ê' => 'Ê', 'ë' => 'ë', 'Ë' => 'Ë', 'í' => 'Ã-', 'Í' => 'Ã', 'ì' => 'ì', 'Ì' => 'ÃŒ', 'î' => 'î', 'Î' => 'ÃŽ', 'ï' => 'ï', 'Ï' => 'Ã', 'ñ' => 'ñ', 'Ñ' => 'Ñ', 'ó' => 'ó', 'Ó' => 'Ó', 'ò' => 'ò', 'Ò' => 'Ã’', 'ô' => 'ô', 'Ô' => 'Ô', 'ö' => 'ö', 'Ö' => 'Ö', 'õ' => 'õ', 'Õ' => 'Õ', 'ø' => 'ø', 'Ø' => 'Ø', 'œ' => 'Å“', 'Œ' => 'Å’', 'ß' => 'ß', 'ú' => 'ú', 'Ú' => 'Ú', 'ù' => 'ù', 'Ù' => 'Ù', 'û' => 'û', 'Û' => 'Û', 'ü' => 'ü', 'Ü' => 'Ü', '€' => '€', '’' => '’', '‚' => '‚', 'ƒ' => 'Æ’', '„' => '„', '…' => '…', '‡' => '‡', 'ˆ' => 'ˆ', '‰' => '‰', 'Š' => 'Å ', '‹' => '‹', 'Ž' => 'Ž', '‘' => '‘', '“' => '“', '•' => '•', '–' => '–', '—' => '—', '˜' => 'Ëœ', '™' => 'â„¢', 'š' => 'Å¡', '›' => '›', 'ž' => 'ž', 'Ÿ' => 'Ÿ', '¡' => '¡', '¢' => '¢', '£' => '£', '¤' => '¤', '¥' => 'Â¥', '¦' => '¦', '§' => '§', '¨' => '¨', '©' => '©', 'ª' => 'ª', '«' => '«', '¬' => '¬', '®' => '®', '¯' => '¯', '°' => '°', '±' => '±', '²' => '²', '³' => '³', '´' => '´', 'µ' => 'µ', '¶' => '¶', '·' => '·', '¸' => '¸', '¹' => '¹', 'º' => 'º', '»' => '»', '¼' => '¼', '½' => '½', '¾' => '¾', '¿' => '¿', 'à' => 'à ', '†' => '†', '”' => 'â€', 'Á' => 'Ã', 'â' => 'â', 'Â' => 'Â', 'Ã' => 'Ã', ); foreach( $new2old as $key => $value ) { $new[] = $key; $old[] = $value; } ?> |
On obtient 2 tableaux avec pour l’un toutes les clés, pour l’autre toutes les valeurs. On peut alors les utiliser avec str_replace()
. Il est important de retrouver les 5 derniers éléments à la fin du tableau, ce sont aussi les caractères généraux : 'Ã', 'â', 'Â', 'Ã', 'â€'
.
1 2 |
<?php $string_new = str_replace( $old, $new, $string ); |
Et voici ce que cela donne avec la chaîne de caractères du début.
1 |
Ne vous découragez pas face aux difficultés. Si cela arrive (et statistiquement cela arrive), respirez, reposez vous un peu et repartez de plus belle. Après les écrits, continuez à travailler les oraux quoi qu’il arrive car le jeu des coefficients fait la part belle à l’oral. Il faut donc y consacrer du temps. Bon courage à toutes, et à tous. Que l’esprit et la force de l’Education Nationale soient avec vous ! A l’œuvre ! ','Se préparer aux concours d\'histoire-géographie (sites, méthode, organisation)' |
Il y a encore quelques petits problèmes, comme pour les caractères Á, Í, Ï, mais ne rencontrant vraiment pas souvent ces caractères en français, on peut dire que cela va.
Et hop, une conversion efficace et qui donne le résultat attendu.
Merci pour la liste de convertion.
Après quelques galères, j’ai trouvé la réponse …
que veut dire « ðŸ‘💯 » car ça ne se trouve pas dans le tableau de conversion
Merci pour la liste !
code
foreach ($new2old as $key => $value) {$str = str_replace($value, $key, $str);
}
return $str;
code