Est PHP fonction serialize compatible UTF-8?
J'ai un site que je veux migrer à partir de ISO à UTF-8.
J'ai un enregistrement dans la base de données indexée par la suite de clé primaire :
s:22:"Informations générales";
Le problème est que, maintenant (avec l'encodage UTF-8), quand je sérialiser la chaîne, j'obtiens :
s:24:"Informations générales";
(notez la taille de la chaîne est le nombre d'octets, et non pas la longueur de la chaîne)
Ce n'est donc pas compatible avec les non-utf8 précédents records !
Ai-je fait quelque chose de mal ? Comment pourrais-je résoudre ce problème ?
Grâce
Des éclats d'obus: cela s'appelle "français" et est, comme tel, de ce pas étrange.
Il ne faisait pas référence à la langue. Il utilise un sérialisé PHP chaîne en tant que clé primaire. Ce qui EST étrange.
il n'est probablement pas se référant à la française.
lol, vous êtes drôle. Je préfère répondre : je sais, vraiment, c'est étrange, mais c'est un cas très particulier, s'il vous plaît ignorer que ^^ (en fait c'est pas une clé primaire, mais j'ai une situation quand j'ai... vous savez... de toute façon)
L'ironie, là, vous allez... Cependant, il est peut-être valable. Penser unique Uri, et si c'est la partie locale (url-décodé), il a parfaitement raison valable pour l'utiliser comme clé primaire.
Il ne faisait pas référence à la langue. Il utilise un sérialisé PHP chaîne en tant que clé primaire. Ce qui EST étrange.
il n'est probablement pas se référant à la française.
lol, vous êtes drôle. Je préfère répondre : je sais, vraiment, c'est étrange, mais c'est un cas très particulier, s'il vous plaît ignorer que ^^ (en fait c'est pas une clé primaire, mais j'ai une situation quand j'ai... vous savez... de toute façon)
L'ironie, là, vous allez... Cependant, il est peut-être valable. Penser unique Uri, et si c'est la partie locale (url-décodé), il a parfaitement raison valable pour l'utiliser comme clé primaire.
OriginalL'auteur Matthieu Napoli | 2010-03-30
Vous devez vous connecter pour publier un commentaire.
Le comportement est tout à fait correcte. Deux chaînes avec différents codages va générer différents flux d'octets, donc différente de la sérialisation des chaînes.
Je sais que cela semble étrange, mais en PHP, les chaînes sont en fait des tableaux d'octets. Vous obtiendrez le même résultat si vous
echo strlen($utf8EncodedString)
. Pour le caractère longueur, vous devezmb_strlen()
.Un autre:
file_get_contents()
vous donnera une chaîne de caractères (même lors de la prise en contenu de fichiers binaires). Prise de fonctions, trop.Yep je sais tous que, c'est juste que je voulais être sûr que si sérialiser a l'aide de "longueur de la chaîne" ou "taille de la mémoire". Et apparemment, c'est la taille de la mémoire, donc je viens de re-générer tous mes enregistrements de base de données qui contiennent des données sérialisées (préalablement encodé en ISO) avec PHP en UTF-8
OriginalL'auteur soulmerge
Un Dump de la base de données en latin1.
Dans la ligne de commande:
Importer le fichier converti en une nouvelle base de données en UTF-8.
Utiliser un script php pour mettre à jour chaque champ.
Faire une requête, en boucle par le biais de de chaque domaine et de mise à jour de la chaîne sérialisée en utilisant ceci:
Après, j'ai été en mesure d'utiliser unserialize() et tout le travail avec l'encodage UTF-8.
OriginalL'auteur Rulo
PHP 4 et 5 n'ont pas intégré dans le support de l'Unicode; je crois que PHP 6 est de commencer à ajouter plus de support de l'Unicode bien que je ne suis pas sûr de la façon qui est.
OriginalL'auteur Amber
À unserialize une codé en utf-8 sérialisé tableau:
OriginalL'auteur sunfish
Vous n'avez rien fait de mal. PHP antérieures à la v6 n'est tout simplement pas conscient Unicode, et, comme telle, ne le supporte pas, si vous n'avez pas battre (c'est à dire, via le
mbstring
extension ou d'autres moyens).Nous ici, écrit notre propre wrapper autour de
serialize()
pour remédier à cela. Vous pouvez, aussi, de passer à d'autres techniques de sérialisation, comme JSON (avecjson_encode()
etjson_decode()
en PHP depuis 5.2.0).OriginalL'auteur Boldewyn