Maison > développement back-end > Problème PHP > Qu'est-ce que cela signifie que PHP ne prend pas en charge l'Unicode ?

Qu'est-ce que cela signifie que PHP ne prend pas en charge l'Unicode ?

藏色散人
Libérer: 2023-03-11 20:10:01
original
2765 Les gens l'ont consulté

php ne prend pas en charge l'unicode, ce qui signifie que les chaînes PHP n'enregistrent pas les informations d'encodage des caractères, donc la fonction d'opération native ne sait pas comment les données binaires correspondent au texte et ne peut supposer qu'un caractère correspond à un seul octet ; de cette façon, lors du traitement de l'anglais et d'autres codes ASCII, cela suffit lors de l'utilisation, mais pour les caractères multi-octets tels que le chinois, des erreurs se produiront.

Qu'est-ce que cela signifie que PHP ne prend pas en charge l'Unicode ?

L'environnement d'exploitation de cet article : système Windows7, version PHP7.1, ordinateur DELL G3

Qu'est-ce que cela signifie que PHP ne prend pas en charge l'Unicode ? Pourquoi dit-il que PHP ne prend pas en charge l’encodage Unicode ?

Je vois souvent des affirmations selon lesquelles PHP ne prend pas en charge Unicode, ou que PHP ne prend pas en charge Unicode au niveau inférieur. Même si je sais que le codage PHP est très pénible et que les différentes fonctions de traitement des chaînes sont très non standard, il peut toujours afficher le chinois. Je n'ai jamais compris ce que cela signifie qu'il ne supporte pas Unicode. J'ai passé du temps à trier ces informations.

Commençons par un exemple :

Un script PHP est le suivant, en supposant que l'encodage du fichier est UTF-8 :

//文件编码UTF-8
echo strlen("中文"); // 6
echo substr("中文",0,1) // 乱码
echo substr("中文",0,3) // 中
Copier après la connexion

C'est étrange d'après ce qui précède, il semble qu'un caractère chinois soit considéré comme 3 caractères. . Cela commence par le stockage des chaînes par PHP.

Je l'ai résumé comme suit :

Les chaînes PHP sont composées de tableaux d'octets. En d'autres termes, comme dans le langage C char a[3] = "abc", un caractère occupe un octet.

De plus, il n'y a pas d'informations d'encodage pour stocker le texte, ce qui signifie que PHP ne sait pas à quel encodage doivent correspondre les données binaires de ces chaînes.

En allant plus loin, PHP déterminera l'encodage de la chaîne en fonction de l'encodage du fichier script. Par exemple : $string = "Chinese" ;, si le fichier de script est UTF-8, l'encodage chinois UTF-8 : E4B8ADE69687 sera enregistré.

De plus, comme mentionné précédemment, PHP n'enregistre pas les informations d'encodage des chaînes. Ainsi, même si le chinois est enregistré sous : E4B8ADE69687, du point de vue de la fonction native de chaîne, il ne s'agit que d'une chaîne de nombres binaires. Par conséquent, les fonctions de chaîne natives PHP ne peuvent fonctionner que sur des caractères à un octet ! Traitez simplement un octet comme un caractère !

Si vous comprenez les points ci-dessus, l'exemple de code ci-dessus sera naturellement compris :

//文件编码UTF-8
echo bin2hex("中文"); // 可以看到,"中文"对应的二进制就是:e4b8ade69687
echo strlen("中文"); // 所以按照单字节来统计长度,就是6 
echo substr("中文",0,1) // 取0到1个字节,也就是e4,并不对应某个字符的编码,所以乱码
echo substr("中文",0,3) // 取0到3个字节,刚好把`中`的编码取出来
Copier après la connexion

De même, si vous modifiez l'encodage du fichier en GBK ou autre, des résultats similaires seront obtenus grâce à d'autres expériences, sauf que GBK est un caractère chinois Occupe 2 octets.

Alors maintenant, vous pouvez essentiellement comprendre pourquoi la couche inférieure de PHP ne prend pas en charge l'Unicode. Le résumé est le suivant :

Les chaînes PHP n'enregistrent pas les informations d'encodage des caractères, donc la fonction d'opération native ne sait pas quoi faire. faire avec des données binaires Correspondant au texte, on ne peut [supposer] qu'un caractère correspond à un seul octet. Cela est suffisant lors du traitement de l'anglais et d'autres codes ASCII, mais pour le chinois et d'autres [caractères multi-octets], des erreurs se produiront.

D'un autre côté, nous pouvons regarder les langages dits sous-jacents qui prennent en charge Unicode :

var string = "中文"
console.log(string.length); // 2
string.substr(0,1) // 中
Copier après la connexion

Vous pouvez voir qu'en JS, les caractères multi-octets peuvent être correctement reconnus et traités. C'est-à-dire que lors du stockage, les informations d'encodage du texte sont également stockées. (Je suppose ici que la valeur Unicode du texte est enregistrée, mais je n'en suis pas sûr car je ne comprends pas les principes sous-jacents de JS)

Ensuite, il y a une question ici, comment les caractères multi-octets peuvent-ils être correctement traités en PHP ? La réponse est l'extension mbstring (pour plus de détails, voir : http://php.net/manual/zh/book.mbstring.php). Ce qu'on appelle mbstring est : chaîne multi-octets, chaîne multi-octets.

Dans cet ensemble d'extensions, il existe une série de fonctions correspondant aux fonctions de chaîne natives, qui peuvent être utilisées pour gérer correctement les caractères multi-octets. Par exemple : strlen correspond à mb_strlen... Parmi ces fonctions correspondantes, elles sont fondamentalement les mêmes que les fonctions natives, sauf qu'elles ont généralement un paramètre optionnel supplémentaire : l'encodage.

Par exemple :

// 脚本类型为UTF-8
echo strlen("中文"); // 6
echo mb_strlen("中文","UTF-8"); //2  使用mb_strlen ,并传入编码 utf-8, 就会把二进制E4B8ADE69687当做utf-8的处理能正确处理
echo mb_strlen("中文"); //2  如果不传编码UTF-8,则函数会自动确定编码,文档说:如果省略,则使用内部字符编码。所以这里也当做UTF-8来处理。
echo mb_strlen("中文","GBK"); //3,如果传入编码GBK,则:e4b8ade69687会被当做gbk来处理,一个gbk字符占2字节,所以为:3
Copier après la connexion

Apprentissage recommandé : "Tutoriel vidéo PHP"

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal