Heim > Artikel > Backend-Entwicklung > Best Practices für PHP und UTF-8
Die PHP-Sprachebene unterstützt keinen Unicode-Zeichensatz, aber die meisten Probleme können durch UTF-8-Codierung gelöst werden.
Die beste Vorgehensweise besteht darin, die Eingabekodierung genau zu kennen (erkennen Sie sie, wenn Sie sie nicht kennen), sie intern einheitlich in die UTF-8-Kodierung zu konvertieren, und die Ausgabekodierung ist ebenfalls einheitlich UTF-8-Kodierung.
Bitte achten Sie beim Betrieb des Unicode-Zeichensatzes darauf, die mbstring-Erweiterung zu installieren und die entsprechende Funktion anstelle der nativen String-Funktion zu verwenden. Wenn eine Datei beispielsweise als UTF-8-PHP-Code kodiert ist und es falsch ist, die Funktion strlen() zu verwenden, verwenden Sie bitte stattdessen die Funktion mb_strlen().
Die meisten Funktionen der mbstring-Erweiterung müssen auf Basis einer Kodierung (interne Kodierung) verarbeitet werden. Das meiste davon kann in PHP.INI konfiguriert werden.
Ab PHP 5.6 kann die default_charset-Konfiguration mbstring.http_input und mbstring.http_output ersetzen.
Eine weitere wichtige Konfiguration ist mbstring.sprache. Der Standardwert ist Neutral (UTF-8).
Beachten Sie, dass die Dateikodierung und die interne Kodierung der MBstring-Erweiterung nicht dasselbe Konzept sind.
Zusammenfassung:
Verwenden Sie UTF-8 so weit wie möglich für die Teile von PHP.INI, die die mbstring-Erweiterung beinhalten.
Bitte verwenden Sie die MBstring-Erweiterungsfunktion anstelle der nativen String-Operationsfunktion.
Wenn Sie verwandte Funktionen verwenden, stellen Sie bitte sicher, dass Sie die Kodierung der von Ihnen bedienten Zeichen verstehen. Zeigen Sie bei Verwendung der entsprechenden Funktionen die UTF-8-Kodierungsparameter an, z. B. htmlentities Der dritte Parameter der ()-Funktion ist in UTF-8 geschrieben.
Hier ist ein Beispiel, wenn Sie eine Datei öffnen möchten, aber nicht wissen, wie der Dateiinhalt kodiert wird ist, was sollten Sie tun? Was ist mit der Verarbeitung?
Die beste Vorgehensweise besteht darin, beim Öffnen einheitlich in UTF-8 zu konvertieren und dann nach Änderung des Inhalts wieder in die ursprüngliche Codierung zu konvertieren und in der Datei zu speichern. Schauen Sie sich den Code an:
if ( mb_internal_encoding()!="UTF-8") { mb_internal_encoding("UTF-8"); } $file = "file.txt"; //一个编码为gbk的中文文件 $str= file_get_contents($file); //不管来源是什么编码,统一显示的时候转换为 UTF-8 if (mb_check_encoding($str,"GBK")) $str = mb_convert_encoding($str,"UTF-8",“GBK”); $str ="修改内容"; $str = mb_convert_encoding($str,$srcbm,"UTF-8"); //原样转回去 file_put_contents($file,$str);
Stellen Sie zunächst sicher, dass Ihr MySQL UTF-8 ist. Dann behält der MySQL-Client auch UTF-8 bei, wenn eine Verbindung zu MySQL hergestellt wird. Wenn beide Seiten konsistent sind, treten im Allgemeinen keine Probleme auf.
Dies ist auch relativ einfach, das heißt, wenn es sich bei Ihrem Ausgabeinhalt um eine Webseite handelt, sollte die Ausgabe Ihrer Zeichenfolgenverarbeitung immer im UTF-Format gehalten werden. 8; gleichzeitig ist der default_charset in PHP.INI auch eindeutig auf UTF-8 gesetzt;
Ist jetzt alles in Ordnung? Nein, obwohl der Server und der Browser die Verwendung der UTF-8-Kodierung zulassen, ist das Verhalten des Benutzers nicht bindend. Der Name ist ein Zeichen in einer anderen Kodierung, also was soll ich tun? Die Kodierung des Benutzers kann über die Funktionen mb_http_input() und mb_check_encoding() ermittelt und dann intern in UTF-8 konvertiert werden. Stellen Sie sicher, dass die endgültige Verarbeitung auf jeder Ebene eine UTF-8-Kodierung ist. Mit anderen Worten: Sie müssen wissen, welche Codierung Ihre Eingabe hat, und die Codierung der Steuerausgabe nach der Verarbeitung ist UTF-8.
Die Verwendung der Direktive mbstring.encoding_translation und der Funktion mb_detect_encoding() ist veraltet. Hat mich lange gefoltert.
Aufgrund von Betriebssystemen verfügt PHP über unterschiedliche Verarbeitungsmechanismen bei der Verarbeitung von Unicode-Dateinamen.
Unter Linux ist der Dateiname immer UTF-8-codiert, während der Dateiname in der chinesischen Windows-Umgebung immer GBK-codiert ist.
Lassen Sie uns dies anhand eines Beispiels veranschaulichen:
//命令行程序函数,运行在中文版 Windows 10 操作系统 ,文件编码为 UTF-8 function filenameexample() { $filename = "测试.txt" ; $gbk_filename = iconv("UTF-8","GBK",$filename); file_put_contents($gbk_filename, "测试"); echo file_get_contents($gbk_filename); } function scandirexample() { $arr = scandir("./tmp"); foreach ($arr as $v) { if ($v == "." || $v =="..") continue ; $filename = iconv( "GBK","UTF-8",$v ) ; $content = file_get_contents("./tmp/" . $v ); } }
Wenn Sie kein Programm schreiben möchten, das mit Windows und Linux kompatibel ist, können Sie den Dateinamen per URL codieren, z. B.:
function urlencodeexample() { $filename = "测试2.txt" ; $urlencodefilename = urlencode($filename) ; file_put_contents($urlencodefilename, "测试"); echo file_get_contents($urlencodefilename); }
Wenn Sie PHP zum Herunterladen von Dateien über die Funktion header() verwenden, müssen Sie auch den Browser und das Betriebssystem berücksichtigen (die meisten Benutzer verwenden Windows, die Codierung des Ausgabedateinamens kann UTF-8 sein). , und Chrome konvertiert den Dateinamen automatisch in die GBK-Kodierung.
Bei niedrigeren Versionen des IE wird die Betriebssystemumgebung übernommen. Wenn der heruntergeladene Dateiname also chinesisch ist, muss er in die UTF-8-Kodierung konvertiert werden, andernfalls wird dem Benutzer beim Herunterladen ein verstümmelter Dateiname angezeigt . Erklären Sie durch Code:
$agent=$_SERVER["HTTP_USER_AGENT"]; if(strpos($agent,'MSIE')!==false { $filename = iconv("UTF-8","GBK","附件.txt"); header("Content-Disposition: attachment; filename=\"$filename\""); }