Heim  >  Artikel  >  Backend-Entwicklung  >  Was bedeutet es, dass PHP Unicode nicht unterstützt?

Was bedeutet es, dass PHP Unicode nicht unterstützt?

藏色散人
藏色散人Original
2021-07-27 09:35:522706Durchsuche

php unterstützt Unicode nicht, was bedeutet, dass PHP-Strings die Codierungsinformationen von Zeichen nicht speichern, sodass die native Operationsfunktion nicht weiß, wie die Binärdaten dem Text entsprechen, und nur davon ausgehen kann, dass ein Zeichen einem einzelnen Zeichen entspricht Byte; Auf diese Weise ist es bei der Verarbeitung von Englisch und anderen ASCII-Codes ausreichend, aber bei Mehrbyte-Zeichen wie Chinesisch treten Fehler auf.

Was bedeutet es, dass PHP Unicode nicht unterstützt?

Die Betriebsumgebung dieses Artikels: Windows7-System, PHP7.1-Version, DELL G3-Computer

Was bedeutet es, dass PHP Unicode nicht unterstützt? Warum heißt es, dass PHP die Unicode-Kodierung nicht unterstützt?

Ich sehe oft Behauptungen, dass PHP Unicode nicht unterstützt oder dass PHP Unicode auf der untersten Ebene nicht unterstützt. Obwohl ich weiß, dass die PHP-Codierung sehr mühsam ist und die verschiedenen String-Verarbeitungsfunktionen sehr vom Standard abweichen, kann sie dennoch Chinesisch anzeigen. Ich habe nie verstanden, was es bedeutet, dass sie Unicode nicht unterstützt. Ich habe einige Zeit damit verbracht, diese Informationen zu sortieren.

Beginnen wir mit einem Beispiel:

Ein PHP-Skript sieht wie folgt aus, vorausgesetzt, die Codierung der Datei ist UTF-8:

//文件编码UTF-8
echo strlen("中文"); // 6
echo substr("中文",0,1) // 乱码
echo substr("中文",0,3) // 中

Es ist seltsam, dass ein chinesisches Zeichen als 3 Zeichen angesehen wird . Dies beginnt mit der Speicherung von Strings durch PHP.

Ich habe es wie folgt zusammengefasst:

PHP-Strings bestehen aus Arrays von Bytes. Mit anderen Worten, ähnlich wie in der C-Sprache char a[3] = „abc“ belegt ein Zeichen ein Byte.

Außerdem gibt es keine Kodierungsinformationen zum Speichern von Text, was bedeutet, dass PHP nicht weiß, welcher Kodierung die Binärdaten dieser Zeichenfolgen entsprechen sollen.

Um noch einen Schritt weiter zu gehen, bestimmt PHP die Kodierung des Strings entsprechend der Kodierung der Skriptdatei. Beispiel: $string = "Chinese";, wenn die Skriptdatei UTF-8 ist, wird die chinesische UTF-8-Kodierung: E4B8ADE69687 gespeichert.

Darüber hinaus speichert PHP, wie bereits erwähnt, die Codierungsinformationen des Strings nicht. Selbst wenn das Chinesisch als E4B8ADE69687 gespeichert wird, handelt es sich aus Sicht der nativen Zeichenfolgenfunktion lediglich um eine Zeichenfolge aus Binärzahlen. Daher können PHP-native String-Funktionen nur mit Einzelbyte-Zeichen arbeiten! Behandeln Sie ein Byte einfach als Zeichen!

Wenn Sie die oben genannten Punkte verstehen, wird das obige Codebeispiel natürlich verstanden:

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

Ähnliche Ergebnisse werden durch weitere Experimente erzielt, wenn Sie die Dateikodierung in GBK oder andere ändern, mit der Ausnahme, dass GBK ein chinesisches Schriftzeichen ist Belegt 2 Bytes.

Jetzt können Sie im Grunde verstehen, was die unterste Ebene von PHP nicht unterstützt. Die Zusammenfassung lautet wie folgt:

PHP-Strings speichern die Codierungsinformationen von Zeichen nicht, sodass die native Betriebsfunktion nicht weiß, was zu tun ist Bei binären Daten kann nur davon ausgegangen werden, dass ein Zeichen einem einzelnen Byte entspricht. Dies ist bei der Verarbeitung von englischen und anderen ASCII-Codes ausreichend, bei chinesischen und anderen [Multibyte-Zeichen] treten jedoch Fehler auf.

Andererseits können wir uns die sogenannten zugrunde liegenden Sprachen ansehen, die Unicode unterstützen:

var string = "中文"
console.log(string.length); // 2
string.substr(0,1) // 中

Sie können sehen, dass in JS Multibyte-Zeichen korrekt erkannt und verarbeitet werden können. Das heißt, beim Speichern werden auch die Kodierungsinformationen des Textes gespeichert. (Ich vermute hier, dass der Unicode-Wert des Textes gespeichert wird, bin mir aber nicht sicher, da ich die zugrunde liegenden Prinzipien von JS nicht verstehe)

Dann stellt sich hier die Frage, wie Multibyte-Zeichen korrekt verarbeitet werden können in PHP? Die Antwort ist die mbstring-Erweiterung (Einzelheiten finden Sie unter: http://php.net/manual/zh/book.mbstring.php). Der sogenannte MBstring ist: Multibyte-String, Multibyte-String.

In diesem Erweiterungssatz gibt es eine Reihe von Funktionen, die den nativen Zeichenfolgenfunktionen entsprechen und zur korrekten Verarbeitung von Multibyte-Zeichen verwendet werden können. Beispiel: strlen entspricht mb_strlen... Unter diesen entsprechenden Funktionen sind sie im Grunde die gleichen wie die nativen Funktionen, außer dass sie normalerweise einen zusätzlichen optionalen Parameter haben: Kodierung.

Zum Beispiel:

// 脚本类型为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

Empfohlenes Lernen: „PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas bedeutet es, dass PHP Unicode nicht unterstützt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn