2010-11-08 20 views
4

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"])); 

Répondre

0

Si vous avez encodages mélangés dans la même colonne, vous avez seulement 1 option raisonnable: magasin sous forme binaire, plutôt que dans un jeu de caractères spéciaux. Si le fichier est dans cp1252 (qui se chevauche pour une grande partie avec ISO-8859-1 donc probablement vous pouvez juste demander cp1252 en entrée), appelez simplement la fonction iconv dessus avant de le charger en XML. ($utf8string = iconv('cp1252','utf-8',$string);)

+0

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 –

+1

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

+0

Ok, je vais vérifier ** iconv ('CP1252', 'UTF-8', $ chaîne); ** –