J'ai un fichier xml avec codage mixte (le fichier doit être dit dans le codage iso-8859-1 cependant) mais contient également des caractères de windows 1252 (symbole de la marque, endash etc)enregistrer les données du fichier xml encodé mixte à utf-8 dans la base de données mysql
Im utilisant PHP et xmlreader pour analyser le fichier xml pour enregistrer dans la base de données. Le serveur MySQL 5.0 enregistre les caractères codés mélangés en tant que caractère de boîte mais MySQL 5.1 donne l'erreur. Donc, la question est, quelle est la méthode de preuve la plus facile et complète pour sauvegarder correctement les données utf-8.
Ceci est mon code actuel pour le convertir en utf-8, je voulais juste savoir, si cela peut créer un problème lors de la conversion?
function cp1252_to_utf8($str)
{
$cp1252_map = array(
"\xc2\x80" => "\xe2\x82\xac", /* EURO SIGN */
"\xc2\x82" => "\xe2\x80\x9a", /* SINGLE LOW-9 QUOTATION MARK */
"\xc2\x83" => "\xc6\x92", /* LATIN SMALL LETTER F WITH HOOK */
"\xc2\x84" => "\xe2\x80\x9e", /* DOUBLE LOW-9 QUOTATION MARK */
"\xc2\x85" => "\xe2\x80\xa6", /* HORIZONTAL ELLIPSIS */
"\xc2\x86" => "\xe2\x80\xa0", /* DAGGER */
"\xc2\x87" => "\xe2\x80\xa1", /* DOUBLE DAGGER */
"\xc2\x88" => "\xcb\x86", /* MODIFIER LETTER CIRCUMFLEX ACCENT */
"\xc2\x89" => "\xe2\x80\xb0", /* PER MILLE SIGN */
"\xc2\x8a" => "\xc5\xa0", /* LATIN CAPITAL LETTER S WITH CARON */
"\xc2\x8b" => "\xe2\x80\xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
"\xc2\x8c" => "\xc5\x92", /* LATIN CAPITAL LIGATURE OE */
"\xc2\x8e" => "\xc5\xbd", /* LATIN CAPITAL LETTER Z WITH CARON */
"\xc2\x91" => "\xe2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
"\xc2\x92" => "\xe2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
"\xc2\x93" => "\xe2\x80\x9c", /* LEFT DOUBLE QUOTATION MARK */
"\xc2\x94" => "\xe2\x80\x9d", /* RIGHT DOUBLE QUOTATION MARK */
"\xc2\x95" => "\xe2\x80\xa2", /* BULLET */
"\xc2\x96" => "\xe2\x80\x93", /* EN DASH */
"\xc2\x97" => "\xe2\x80\x94", /* EM DASH */
"\xc2\x98" => "\xcb\x9c", /* SMALL TILDE */
"\xc2\x99" => "\xe2\x84\xa2", /* TRADE MARK SIGN */
"\xc2\x9a" => "\xc5\xa1", /* LATIN SMALL LETTER S WITH CARON */
"\xc2\x9b" => "\xe2\x80\xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
"\xc2\x9c" => "\xc5\x93", /* LATIN SMALL LIGATURE OE */
"\xc2\x9e" => "\xc5\xbe", /* LATIN SMALL LETTER Z WITH CARON */
"\xc2\x9f" => "\xc5\xb8" /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);
return strtr(utf8_encode($str), $cp1252_map);
}
$sql='SET NAMES "utf8" COLLATE "utf8_swedish_ci"';
mysql_query($sql);
$arr_book["booktitle"] = cp1252_to_utf8(iconv("UTF-8", "ISO-8859-1//TRANSLIT", $arr_book["
booktitle"]));
ya, j'ai mis à jour ma question et vous pouvez voir le code actuel, j'utilise. Si une chaîne ne contient pas de codage mixte, elle ne sera pas convertie à partir de Windows 1252, correct? aussi la fonction cp1252_to_utf8, devra-t-elle être modifiée pour les caractères, non listés dans le tableau $ cp1252_map –
Je n'ai aucun moyen facile de valider ta fonction 'cp1252_to_utf8' personnalisée (pourquoi la réinventer si la fonction' iconv' est si facile à utiliser?), même sur les boîtes Linux, une droite 'iconv ('CP1252', 'UTF-8', $ chaîne);' devrait juste fonctionner, oublier qu'ils _claim_ c'est ISO-8859-1, ce n'est clairement pas, et la seule différence entre eux est AFAIK la gamme 0x80 à 0x9F. – Wrikken
Ok, je vais vérifier ** iconv ('CP1252', 'UTF-8', $ chaîne); ** –