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.
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) // 中
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个字节,刚好把`中`的编码取出来
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) // 中
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
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!