Question

J'ai un site que je veux migrer de ISO UTF-8 .

J'ai un enregistrement dans la base de données indexée par la clé primaire suivante:

s:22:"Informations générales";

Le problème est, maintenant (UTF-8), quand je sérialiser la chaîne, je reçois:

s:24:"Informations générales";

(notez la taille de la chaîne est maintenant le nombre d'octets, pas la longueur de chaîne)

Donc, ce n'est pas compatible avec les précédents records non-UTF8!

Ai-je fait quelque chose de mal? Comment pourrais-je résoudre ce problème?

Merci

Était-ce utile?

La solution

Le comportement est tout à fait correct. Deux chaînes avec différents encodages généreront différents flux d'octets, donc différentes chaînes de sérialisation.

Autres conseils

Vider la base de données latin1.

Dans la ligne de commande:

sed  -e 's/latin1/utf8/g' -i ./DBNAME.sql

Importer le fichier converti en une nouvelle base de données en UTF-8.

Utilisez un script php pour mettre à jour chaque champ. Faire une requête, une boucle à travers chaque champ et mettre à jour la chaîne sérialisé en utilisant ceci:

$str = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str);

Après cela, j'ai pu utiliser unserialize () et tout fonctionne avec UTF-8.

PHP 4 et 5 n'ont intégré le support Unicode; Je crois que PHP 6 commence à ajouter le support Unicode bien que je ne suis pas sûr de savoir comment est complet.

Pour désérialiser un utf-8 matrice codée série:

$array = @unserialize($arrayFromDatabase);
if ($array === false) {
  $array =  @unserialize(utf8_decode($arrayFromDatabase)); //decode first
  $array = array_map('utf8_encode', $array ); // encode the array again
}

Tu as fait rien de mal. PHP avant v6 est tout simplement pas Unicode au courant, et en tant que telle ne supporte pas, si vous ne battez pas être (par exemple, via l'extension de mbstring ou d'autres moyens).

Nous ici écrit notre propre emballage autour serialize() pour y remédier. Vous pouvez aussi passer à d'autres techniques de sérialisation, comme JSON (avec json_encode() et json_decode() en PHP depuis 5.2.0).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top