Heim  >  Artikel  >  Backend-Entwicklung  >  Verstümmelte chinesische PHP-Lösung

Verstümmelte chinesische PHP-Lösung

巴扎黑
巴扎黑Original
2016-11-12 15:27:021065Durchsuche

1. Die erste ist die Kodierung der PHP-Webseite

1. Die Kodierung der PHP-Datei selbst und die Kodierung der Webseite sollten übereinstimmen

a. dann sollte PHP den Header ausgeben: header("Content- Type: text/html;charset=gb2312"), add Auf der statischen Seite ist das Kodierungsformat aller Dateien ANSI. Öffnen Sie Notepad, speichern Sie es unter, wählen Sie die Kodierung als ANSI aus und überschreiben Sie die Quelldatei.

b. Wenn Sie die UTF-8-Kodierung verwenden möchten, sollte PHP den Header ausgeben: header("Content-Type: text/html;charset=utf-8") und , das Codierungsformat aller Dateien ist utf-8. Das Speichern als UTF-8 kann etwas mühsam sein. Wenn Sie Session verwenden, können Sie Editplus zum Speichern verwenden. Parameterauswahl->Datei-> UTF-8-Signatur, wählen Sie Immer löschen und speichern Sie dann, um die Stücklisteninformationen zu entfernen.

2. PHP selbst ist kein Unicode, alle Funktionen wie substr müssen in mb_substr geändert werden (mbstring-Erweiterung muss installiert werden); oder iconv kann zum Transkodieren verwendet werden.

2. Dateninteraktion zwischen PHP und MySQL

Die Kodierung von PHP und der Datenbank sollte konsistent sein

1. Ändern Sie die MySQL-Konfigurationsdatei my.ini oder my.cnf. Verwenden Sie am besten die utf8-Kodierung für MySQL

[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
default-storage-engine=MyISAM
Fügen Sie unter [mysqld] hinzu:
default-collation=utf8_bin
init_connect='SET NAMES utf8'

2. Fügen Sie mysql_query("set names'coding'"); vor dem PHP-Programm hinzu, das benötigt wird um Datenbankoperationen durchzuführen, und die PHP-Codierung ist konsistent. Wenn die PHP-Codierung gb2312 ist, ist die MySQL-Codierung utf8. Auf diese Weise werden verstümmelte Zeichen angezeigt erscheint nicht beim Einfügen oder Abrufen von Daten

3. PHP hängt mit dem Betriebssystem zusammen

Die Codierung von Windows und Linux ist unterschiedlich. Wenn in der Windows-Umgebung die Parameter UTF-8-Codierung aufweisen, treten Fehler auf, z. B. move_uploaded_file(). , filesize() , readfile() usw. Diese Funktionen werden häufig bei der Verarbeitung von Uploads und Downloads verwendet. Beim Aufruf kann der folgende Fehler auftreten:

Warnung: move_uploaded_file()[function.move-uploaded-file] : Stream konnte nicht geöffnet werden: Ungültiges Argument in ...

Warnung: move_uploaded_file()[function.move-uploaded-file]: '' kann nicht nach '' in ... verschoben werden

Warnung: filesize() [function.filesize]: stat failed for ... in ...

Warnung: readfile() [function.readfile]: failed to open stream: Ungültiges Argument in ..

Obwohl diese Fehler bei Verwendung der gb2312-Kodierung in einer Linux-Umgebung nicht auftreten, wird der gespeicherte Dateiname verstümmelt und die Datei kann nicht gelesen werden. In diesem Fall können die Parameter in die vom Betriebssystem erkannte Kodierung konvertiert werden System. Die Kodierungskonvertierung kann mit mb_convert_encoding (Zeichenfolge, neue Kodierung, ursprüngliche Kodierung) oder iconv (ursprüngliche Kodierung, neue Kodierung, Zeichenfolge) erfolgen, sodass der nach der Verarbeitung gespeicherte Dateiname nicht verstümmelt wird und die Datei auch nicht verstümmelt werden kann Normal lesen, um das Hoch- und Herunterladen chinesischer Namensdateien zu ermöglichen.

Tatsächlich gibt es eine bessere Lösung, die vollständig vom System getrennt ist und keine Notwendigkeit besteht, die Codierung des Systems zu berücksichtigen. Sie können als Dateinamen nur eine Folge von Buchstaben und Zahlen generieren und den ursprünglichen Namen mit chinesischen Zeichen in der Datenbank speichern. Auf diese Weise gibt es beim Aufruf von move_uploaded_file() keine Probleme, Sie müssen nur Änderungen vornehmen Der Dateiname wird mit chinesischen Schriftzeichen zum Originalnamen. Der Code zum Implementieren des Herunterladens lautet wie folgt:

header("Pragma: public");

header("Expires: 0");

header("Cache- Komponente: muss erneut validiert werden, Post-Check=0, Pre-Check=0");

header("Content-type: $file_type");

header("Content-Length : $file_size" );

header("Content-Disposition: attachment; filename="$file_name"");

header("Content-Transfer-Encoding: binär");

readfile($file_path);

$file_type ist der Dateityp, $file_name ist der ursprüngliche Name, $file_path ist die Adresse der im Dienst gespeicherten Datei.

4. Fassen wir zusammen, warum verstümmelte Zeichen erscheinen

Im Allgemeinen gibt es zwei Gründe für das Erscheinen verstümmelter Zeichen. Der erste liegt an der falschen Kodierungseinstellung (Zeichensatz), die dazu führt, dass der Browser mit der falschen Kodierung analysiert. Der zweite Grund ist, dass die Datei in der falschen Kodierung geöffnet und dann gespeichert wurde. Beispielsweise wurde eine Textdatei ursprünglich in GB2312 kodiert, aber in der UTF-8-Kodierung geöffnet und dann gespeichert. Um das obige Problem mit verstümmeltem Code zu lösen, müssen Sie zunächst wissen, welche Aspekte der Entwicklung eine Codierung beinhalten:

1. Dateicodierung: bezieht sich auf die Codierung, in der die Seitendatei (.html, .php usw.) selbst ist gerettet. Notepad und Dreamweaver erkennen beim Öffnen der Seite automatisch die Dateikodierung, sodass es weniger Probleme gibt. Allerdings erkennt ZendStudio die Kodierung nicht automatisch. Es öffnet die Datei nur in einer bestimmten Kodierung entsprechend der Konfiguration der Einstellungen. Wenn Sie die Datei während der Arbeit versehentlich mit der falschen Kodierung öffnen und sie nach der Änderung verstümmelt speichern Charaktere werden erscheinen (ich fühle es tief).

2. Kodierung der Seitendeklaration: Im HTML-Code HEAD können Sie verwenden, um dem Browser dies mitzuteilen Die Webseite verwendet welche Codierung. Derzeit verwendet XXX hauptsächlich GB2312 und UTF-8 bei der Entwicklung chinesischer Websites.

3. Datenbankverbindungscodierung: Bezieht sich darauf, welche Codierung zum Übertragen von Daten an die Datenbank verwendet wird Datenbankoperationen. Was hier beachtet werden muss, ist nicht mit der Codierung der Datenbank selbst zu verwechseln. Beispielsweise ist die Standardcodierung von MySQL die Latin1-Codierung, was bedeutet, dass MySQL Daten in der Latin1-Codierung speichert und Daten an MySQL überträgt in anderen Codierungen wird in die Latin1-Codierung konvertiert. Wenn Sie wissen, wo die Codierung in die WEB-Entwicklung involviert ist, kennen Sie auch die Ursache für verstümmelte Codes: Die oben genannten drei Codierungseinstellungen sind inkonsistent. Englische Symbole werden nicht angezeigt und Chinesisch wird nicht angezeigt. 5. Bekämpfen Sie einige häufige Fehlersituationen und Lösungen: 1. Die Datenbank verwendet UTF8-Kodierung und die Kodierung der Seitendeklaration GB2312, die häufigste Ursache für verstümmelte Zeichen. Zu diesem Zeitpunkt werden die direkten SELECT-Daten im PHP-Skript verstümmelt. Sie müssen es vor der Abfrage verwenden: mysql_query("SET NAMES GBK"); Kodierung, um sicherzustellen, dass die Kodierung der Seitendeklaration mit der hier festgelegten Verbindungskodierung übereinstimmt ( GBK ist eine Erweiterung von GB2312. Wenn die Seite UTF-8-kodiert ist, können Sie Folgendes verwenden: mysql_query("SET NAMES UTF8");
Beachten Sie, dass es sich um UTF8 anstelle des häufig verwendeten UTF-8 handelt. Wenn die interne Codierung konsistent ist, müssen Sie die Verbindungscodierung nicht festlegen.

Hinweis: Tatsächlich handelt es sich um die Dateneingabe und -ausgabe von MYSQL ist komplizierter als das, was oben erwähnt wurde. In der MYSQL-Konfigurationsdatei my.ini sind zwei Standardkodierungen definiert: [client] und default-character-set in [mysqld], die jeweils die von der Clientverbindung verwendete Kodierung festlegen Die oben angegebene Codierung erfolgt tatsächlich, wenn der MYSQL-Client eine Verbindung zum Server herstellt. Der Befehlszeilenparameter „character_set_client“ wird verwendet, um dem MYSQL-Server mitzuteilen, welche Codierung die empfangenen Clientdaten verwenden

2. Die Kodierung der Seitendeklaration stimmt nicht mit der Kodierung der Datei selbst überein. Wenn die Kodierung inkonsistent ist, wird beim Erstellen der Seite meistens verstümmelter Code angezeigt wird durch die Behebung einiger kleiner Fehler nach der Veröffentlichung, das Öffnen der Seite mit der falschen Codierung und das anschließende Speichern verursacht. Oder Sie verwenden eine FTP-Software, um Dateien direkt online zu ändern, z. B. CuteFTP. Aufgrund einer falschen Software-Kodierungskonfiguration wird die falsche Kodierung konvertiert.


3. Einige Freunde, die virtuelle Hosts mieten, haben trotz der korrekten Einstellung der oben genannten drei Codierungen immer noch verstümmelte Zeichen. Wenn die Webseite beispielsweise in GB2312 kodiert ist, wird sie beim Öffnen von Browsern wie dem IE immer als UTF-8 erkannt. Der HEAD der Webseite hat bereits angegeben, dass es sich um GB2312 handelt, nachdem die Browserkodierung manuell auf GB2312 geändert wurde , die Seite wird normal angezeigt. Der Grund dafür ist, dass der Server-Apache die globale Standardkodierung des Servers festlegt und AddDefaultCharset UTF-8 in httpd.conf hinzufügt. Zu diesem Zeitpunkt sendet der Server zuerst den HTTP-Header und seine Priorität ist höher als die auf der Seite deklarierte Codierung. Natürlich erkennt der Browser ihn falsch. Es gibt zwei Lösungen. Administratoren sollten AddDefaultCharset GB2312 zur Konfigurationsdatei ihrer eigenen virtuellen Maschine hinzufügen, um die globale Konfiguration zu überschreiben, oder sie in .htaccess in ihrem eigenen Verzeichnis konfigurieren.

Zusammenfassung: Kurz gesagt, der beste und schnellste Weg, den chinesischen verstümmelten Code in PHP zu lösen, besteht darin, die von der Seite deklarierte Codierung mit der internen Codierung der Datenbank in Einklang zu bringen Seite stimmt nicht mit der internen Codierung der Datenbank überein. Definieren Sie den Verbindungscode mysql_query("SET NAMES XXX"); Fehler:

test.php ?a=Hello&b=Hello

Passing Parameter verursachen einen internen Fehler

Lösung: "test.php ?a =".urlencode(Hello)."&b=".urlencode(Hello)

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