En programmation PHP, les opérations sur les tableaux rencontrent parfois des problèmes liés à la conversion de l'encodage.
En raison de l'effet d'affichage de certains caractères spéciaux, j'ai changé utf-8 en GBK. En raison de l'utilisation de la technologie ajax, cela implique également un vieux problème : la conversion de l'encodage.
Certaines validation de formulaire doivent renvoyer des données json. La fonction json_encode de PHP ne prend en charge que l'encodage utf-8, je n'ai donc pas d'autre choix que d'iconv. L'effet souhaité est de convertir le tableau GBK en. un tableau utf-8 à la fonction json_encode.
Voici comment cela a été fait initialement. Après avoir sérialisé le tableau, utilisez la fonction iconv pour convertir l'encodage, puis désérialisez-le :
Le code est le suivant :
unserialize(iconv('gbk','utf-8',serialize($array)));
Le résultat obtenu était vide, mais ensuite je me suis souvenu que l'encodage par défaut ini_set('default_charset', 'gbk'); avait été défini dans le fichier de configuration ; gbk pour désérialiser les chaînes utf-8, ici Il devrait également être possible d'ajouter ini_set('default_charset', 'utf-8'); entre la sérialisation et la désérialisation, mais cela semble toujours un peu gênant car il s'agit d'un encodage global paramètre, ce qui peut facilement entraîner des erreurs à d'autres endroits, tels que des opérations de base de données. Changez ensuite d'idée, utilisez la méthode de sérialisation pour construire le prototype du tableau et utilisez la fonction var_export. La fonction finale est la suivante :
Le code est le suivant :
function array_iconv($in_charset,$out_charset,$arr){ return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';')); }
Le le principe est très simple var_export définit le deuxième paramètre sur true , renvoie la chaîne prototype du tableau, convertit la chaîne en codage utf-8, puis utilise eval pour effectuer le retour (similaire à fonction anonyme ?), ce qui résout parfaitement le problème.
Suivi : Plus tard, j'ai cherché des informations sur Internet pour voir s'il existe une meilleure méthode. Tout ce que j'ai trouvé est similaire. Ils utilisent tous l'appel récursif iconv s'il y a trop d'éléments de tableau ou plus. dimensions, les performances seront réduites. Ce n'est certainement pas si bon. Ce qui est mieux, c'est la méthode du code natif. Vous n'avez pas besoin de vous demander s'il s'agit d'un tableau à N dimensions ou d'un tableau associatif. pour garantir la cohérence des données avant et après la conversion du tableau. À en juger par la longueur du code et la comparaison entre les boucles et les méthodes natives, je pense que tout le monde a déjà le choix.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!