Das Problem der chinesischen Kodierung in der PHP-Programmierung hat viele Menschen beunruhigt. Der Grund für dieses Problem ist eigentlich sehr einfach. Jedes Land (oder jede Region) legt den Zeichenkodierungssatz für den Computerinformationsaustausch fest, beispielsweise den erweiterten ASCII-Code GB2312 in China. -80, Japans JIS usw. Als Grundlage für die Informationsverarbeitung in diesem Land/dieser Region spielen Zeichenkodierungssätze eine wichtige Rolle bei der Vereinheitlichung der Kodierung. Zeichenkodierungssätze werden je nach Länge in zwei Kategorien unterteilt: SBCS (Einzelbyte-Zeichensatz) und DBCS (Doppelbyte-Zeichensatz). In früher Software (insbesondere Betriebssystemen) wurden verschiedene lokalisierte Versionen (L10N) eingeführt, um die Computerverarbeitung lokaler Zeicheninformationen zu lösen. Zur Unterscheidung wurden Konzepte wie LANG und Codepage eingeführt. Aufgrund der überlappenden Codebereiche verschiedener lokaler Zeichensätze ist es jedoch schwierig, Informationen untereinander auszutauschen; die Kosten für die unabhängige Wartung jeder lokalisierten Version der Software sind hoch. Daher ist es notwendig, die Gemeinsamkeiten in der Lokalisierungsarbeit zu extrahieren und sie konsistent zu verarbeiten, um spezielle Lokalisierungsverarbeitungsinhalte zu minimieren. Dies wird auch Internationalisierung (118N) genannt. Verschiedene Sprachinformationen werden als Locale-Informationen weiter standardisiert. Der zugrunde liegende verarbeitete Zeichensatz wurde zu Unicode, der fast alle Glyphen enthält.
Derzeit basiert der Großteil der Kernzeichenverarbeitung von Software mit internationalen Merkmalen auf Unicode. Wenn die Software ausgeführt wird, werden die entsprechenden lokalen Zeichenkodierungseinstellungen entsprechend den jeweiligen Gebietsschema-/Sprach-/Codepage-Einstellungen bestimmt entsprechend bearbeitet. Während der Verarbeitung ist es notwendig, die gegenseitige Konvertierung zwischen Unicode und lokalen Zeichensätzen oder sogar die gegenseitige Konvertierung zwischen zwei verschiedenen lokalen Zeichensätzen mit Unicode als Mitte zu realisieren. Diese Methode wird in der Netzwerkumgebung weiter ausgeweitet, und alle Zeicheninformationen an beiden Enden des Netzwerks müssen entsprechend den Zeichensatzeinstellungen auch in akzeptable Inhalte umgewandelt werden.
Probleme mit der Zeichensatzkodierung in Datenbanken
Beliebte relationale Datenbanksysteme unterstützen alle die Datenbankzeichensatzkodierung. Das bedeutet, dass Sie beim Erstellen einer Datenbank eigene Zeichensatzeinstellungen angeben können und die Datenbankdaten in der angegebenen Kodierung gespeichert werden. Wenn eine Anwendung auf Daten zugreift, findet sowohl am Ein- als auch am Austrittspunkt eine Konvertierung der Zeichensatzkodierung statt. Bei chinesischen Daten sollte die Einstellung der Datenbankzeichenkodierung die Integrität der Daten gewährleisten. GB2312, GBK, UTF-8 usw. sind alles optionale Datenbank-Zeichensatzkodierungen. Natürlich können wir auch ISO8859-1 (8-Bit) wählen, aber wir müssen vor
der Anwendung
ein 16-Bit-chinesisches Zeichen oder Unicode konvertieren schreibt Datenin zwei 8-Bit-Zeichen. Nach dem Lesen der Daten müssen Sie die beiden Bytes zusammenführen und die SBCS-Zeichen identifizieren. Daher empfehlen wir nicht, ISO8859-1 als Datenbankzeichensatz zu verwenden. Dadurch wird nicht nur die Zeichensatzkodierungsunterstützung der Datenbank selbst nicht vollständig genutzt, sondern es erhöht sich auch die Komplexität der Programmierung. Beim Programmieren können Sie zunächst mithilfe der Verwaltungsfunktionen des Datenbankverwaltungssystems prüfen, ob die chinesischen Daten korrekt sind.
Bevor die Datenbank abgefragt wird, führt das PHP-Programm zunächst mysql_query("SET NAMES xxxx"); aus, wobei xxxx die Codierung Ihrer Webseite ist (charset=xxxx, wenn charset=utf8 in der Webseite, dann xxxx=utf8, falls charset). =gb2312 auf der Webseite, dann xxxx=gb2312, fast alle WEB-Programme haben einen gemeinsamen Code zum Herstellen einer Verbindung zur Datenbank, der in einer Datei abgelegt wird. Fügen Sie dieser Datei einfach mysql_query("SET NAMES xxxx") hinzu.
SET NAMES zeigt an, welcher Zeichensatz in der vom Client gesendeten SQL-Anweisung verwendet wird. Daher teilt die SET NAMES-Anweisung „utf-8“ dem Server mit, dass „zukünftige Informationen von diesem Client den Zeichensatz utf-8 verwenden werden“. Es gibt außerdem den Zeichensatz für die Ergebnisse an, die der Server an den Client zurücksendet (wenn Sie beispielsweise eine SELECT-Anweisung verwenden, gibt es an, welcher Zeichensatz für die Spaltenwerte verwendet wird).
Häufig verwendete Techniken zum Auffinden von Problemen bei
chinesischer Codierung verwenden normalerweise die dümmste und effektivste Methode: das Drucken des internen Codes der Zeichenfolge nach der Verarbeitung durch das Programm, das Sie für verdächtig halten. Durch Drucken des internen Codes einer Zeichenfolge können Sie herausfinden, wann chinesische Zeichen in Unicode konvertiert werden, wann Unicode wieder in chinesischen internen Code konvertiert wird, wann ein chinesisches Zeichen zu zwei Unicode-Zeichen wird und wann eine chinesische Zeichenfolge in eine Zeichenfolge konvertiert wird Fragezeichen, wann wurden die höherwertigen Bits der chinesischen Zeichenfolge abgeschnitten?
Die Verwendung einer geeigneten Beispielzeichenfolge kann auch dabei helfen, die Art der Frage zu unterscheiden. Zum Beispiel: „ aaahaa?@aa “ und andere Zeichenfolgen, die abwechselnd Chinesisch und Englisch sind und sowohl GB- als auch GBK-charakteristische Zeichen enthalten. Im Allgemeinen werden englische Zeichen nicht verzerrt, egal wie sie konvertiert oder verarbeitet werden (wenn Sie auf sie stoßen, können Sie versuchen, die Länge aufeinanderfolgender englischer Buchstaben zu erhöhen).
Lösen Sie Probleme mit verstümmeltem Code in verschiedenen Anwendungen
. 1) Verwenden Sie Tags, um die Seitencodierung festzulegen.
Die Funktion dieses Tags besteht darin, anzugeben, welche Zeichensatzcodierung der Browser des Clients zum Anzeigen der Seite verwendet MySQL (UTF8) und so weiter. Daher können die meisten Seiten diese Methode verwenden, um dem Browser mitzuteilen, welche Codierung beim Anzeigen dieser Seite verwendet werden soll, um Codierungsfehler und verstümmelte Zeichen zu vermeiden. Aber manchmal werden wir feststellen, dass dieser Satz immer noch nicht funktioniert. Egal welcher xxx ist, der Browser verwendet immer die gleiche Codierung. Auf diese Situation werde ich später noch eingehen.
Bitte beachten Sie, dass es sich um HTML-Informationen handelt und lediglich eine Anweisung ist, die lediglich anzeigt, dass der Server die HTML-Informationen an den Browser übergeben hat.
2) header("content-type:text/html; charset=xxx");
Die Funktion dieser Funktion header() besteht darin, die Informationen in den Klammern an den http-Header zu senden. Wenn der Inhalt in den Klammern dem im Artikel genannten entspricht, ist die Funktion grundsätzlich dieselbe wie die der Beschriftung. Wenn Sie sie mit der ersten vergleichen, werden Sie feststellen, dass die Zeichen ähnlich sind. Der Unterschied besteht jedoch darin, dass der Browser bei Vorhandensein dieser Funktion immer die von Ihnen angeforderte XXX-Kodierung verwendet und niemals ungehorsam ist. Daher ist diese Funktion sehr nützlich. Warum passiert das? Dann müssen wir über den Unterschied zwischen http-Header und HTML-Informationen sprechen:
HTTP-Header ist eine Zeichenfolge, die vom Server gesendet wird, bevor HTML-Informationen mithilfe des http-Protokolls an den Browser gesendet werden. Das Tag gehört zu den HTML-Informationen, sodass der von header() gesendete Inhalt zuerst den Browser erreicht. Der beliebte Punkt ist, dass header() eine höhere Priorität hat (ich weiß nicht, ob ich das sagen kann). Wenn eine PHP-Seite sowohl einen Header („content-type:text/html;charset=xxx“) als auch einen Header („content-type:text/html;charset=xxx“) hat, erkennt der Browser nur den früheren http-Header und nicht das Meta. Natürlich kann diese Funktion nur innerhalb von PHP-Seiten verwendet werden.
Es bleibt auch die Frage offen, warum ersteres definitiv funktioniert, letzteres jedoch manchmal nicht. Aus diesem Grund werden wir als nächstes über Apache sprechen.
3) AddDefaultCharset
Im conf-Ordner im Apache-Stammverzeichnis befindet sich das gesamte Apache-Konfigurationsdokument httpd.conf.
Öffnen Sie httpd.conf mit einem Texteditor (kann in verschiedenen Versionen unterschiedlich sein) enthält AddDefaultCharset xxx, wobei xxx der Codierungsname ist. Die Bedeutung dieser Codezeile: Stellen Sie den Zeichensatz im HTTP-Header der Webseitendatei auf dem gesamten Server auf Ihren Standard-xxx-Zeichensatz ein. Das Vorhandensein dieser Zeile entspricht dem Hinzufügen eines Headers („content-type: text/html; charset=xxx“) zu jeder Datei. Jetzt können Sie verstehen, warum der Browser immer gb2312 verwendet, obwohl er auf utf-8 eingestellt ist.
Wenn die Webseite einen Header („content-type:text/html; charset=xxx“) enthält, wird der Standardzeichensatz auf den von Ihnen festgelegten Zeichensatz geändert, sodass diese Funktion immer nützlich ist. Wenn Sie vor AddDefaultCharset xxx ein „#“ hinzufügen, diesen Satz auskommentieren und die Seite keinen Header („content-type...“) enthält, ist das Meta-Tag an der Reihe, wirksam zu werden.
Die Prioritätsreihenfolge der oben genannten ist unten aufgeführt:
.. header("content-type:text/html; charset=xxx")
.. AddDefaultCharset xxx
..
Wenn Sie ein Webprogrammierer sind, wird empfohlen, jedem einen Header hinzuzufügen Ihrer Seiten („content-type:text/html;charset=xxx“), stellt dies sicher, dass es auf jedem Server korrekt angezeigt werden kann und eine starke Portabilität aufweist.
4) Default_charset-Konfiguration in php.ini:
default_charset = „gb2312“ in php.ini definiert den Standardsprachenzeichensatz von PHP. Im Allgemeinen wird empfohlen, diese Zeile auszukommentieren und den Browser die Sprache automatisch anhand des Zeichensatzes im Webseiten-Header auswählen zu lassen, anstatt eine zwingende Anforderung zu stellen, sodass Webdienste in mehreren Sprachen auf demselben Server bereitgestellt werden können.
Fazit
Tatsächlich ist die chinesische Codierung in der PHP-Entwicklung nicht so kompliziert wie gedacht. Obwohl es keine festen Regeln für die Positionierung und Lösung von Problemen gibt und auch verschiedene Betriebsumgebungen unterschiedlich sind, sind die zugrunde liegenden Prinzipien dieselben. Das Verständnis der Kenntnis von Zeichensätzen ist die Grundlage für die Lösung von Zeichenproblemen. Allerdings wird es mit den Änderungen im chinesischen Zeichensatz nicht nur bei der PHP-Programmierung, sondern auch bei der chinesischen Informationsverarbeitung noch einige Zeit lang zu Problemen kommen.