Heim > Artikel > Backend-Entwicklung > Strings, Kodierung, UTF-8 in PHP
Ich habe in letzter Zeit viele Artikel zum Thema Codierung gelesen, daher werde ich sie in zwei Blog-Beiträge aufteilen, um über „PHP, Strings, Codierung, UTF-8“-bezogenes Wissen zu sprechen Die erste Hälfte ist zweigeteilt. Es gibt vier Hauptinhaltsabschnitte, nämlich „Definition und Verwendung von Strings“, „String-Konvertierung“, „Essenz von PHP-Strings“ und „Multibyte-Strings“. Die erste Hälfte ist relativ einfach.
Es gibt vier Möglichkeiten, Strings in PHP festzulegen:
Strings in einfachen Anführungszeichen
Zeichenfolgen in einfachen Anführungszeichen ähneln den Originalzeichenfolgen in Python, d. Beispielsweise verfügt $str='hellonworld', n darin über keine Newline-Funktion.
String in doppelten Anführungszeichen
String in doppelten Anführungszeichen verfügt über eine Variable-Parsing-Funktion und eine Sonderzeichen-Escape-Funktion, die String in einfachen Anführungszeichen nicht hat.
Ich interessiere mich sehr für das spezielle Escapezeichen von Hexadezimal- und Oktalzeichenfolgen. Besonderer Zusatz:
\[0-7]{1,3} #八进制表达方式 \x[0-9A-Fa-f]{1,2} #十六进制表达方式
heredoc
Dieser Ausdruck ist ähnlich zu einer langen Zeichenfolge in Python und kann eine Zeichenfolge definieren, die mehrere Zeilen enthält. Die grammatikalische Definition ist sehr streng, daher müssen Sie bei der Verwendung vorsichtig sein.
$str=<<<EOD hello\n world EOD;
Nowdoc
Nowdoc ähnelt einer Zeichenfolge in einfachen Anführungszeichen und analysiert keine Variablen. Es eignet sich besser zum Definieren eines großen Textabschnitts, ohne Sonderzeichen zu maskieren.
Variablenparsing
Der leistungsstärkste Teil von PHP-Strings ist das Parsen von Variablen zur Laufzeit (dies ist eine interpretierte Sprache). wunderbare Verwendungsmöglichkeiten.
Einfaches Parsen von Variablen bedeutet, dass die Zeichenfolge „Variablen“, „Arrays“ und „Objektattribute“ enthalten kann. Komplexe Syntaxregeln bestehen darin, {}-Symbole zu verwenden (um einen Ausdruck zu bilden).
Nehmen wir ein Beispiel, um die Leistungsfähigkeit des Variablenparsings zu sehen.
class beers { const softdrink = 'softdrink'; public static $ale = 'ale'; public $data = array(1,3,"k"=>4); } $softdrink = "softdrink"; $ale = "ale"; $arr = array("arr1","arr2","arr3"=>"arr4","arr4"=>array(1,2)); $arr4 = "arr4"; $obj = new beers; echo "line1:{$arr[1]}\n"; echo "line2:{$arr['arr4'][0]}\n"; echo "line3:{$obj->data[1]}\n"; echo "line4:{${$arr['arr3']}}\n"; echo "line5:{${$arr['arr3']}[1]}\n"; echo "line6:{${beers::softdrink}}\n"; echo "line7:{${beers::$ale}}\n";
Ein weiterer Grund, warum die PHP-Sprache einfacher als Python ist, ist die implizite Konvertierung von Typen , vereinfacht viele Vorgänge, die hier durch String-Konvertierung erläutert werden.
Zwang zum String-Typ
$var = 10 ; $dvar = (string)$var ; echo $dvar . "_" . gettype($dvar);
Die Funktion strval() dient dazu, den String-Wert der Variablen abzurufen:
$var = 10.2 ; $dvar = strval($var) ; echo gettype($var) . "_" . $dvar . "_" . gettype($dvar);
settype( ) Die Funktion besteht darin, den Typ der Variablen festzulegen:
$str = "10hello"; settype($str, "integer"); echo $str ;
Während des erzwungenen Typkonvertierungsprozesses werden bestimmte Regeln befolgt, wenn andere Wertetypen in Zeichenfolgen konvertiert werden. Beispiel: a Der boolesche Wert TRUE wird in „1“ der Zeichenfolge umgewandelt. Es ist am besten, die relevanten Regeln zu verstehen.
Automatische Typkonvertierung
Die beiden oben genannten Konvertierungen sind Anzeigekonvertierungen. Wichtiger ist die automatische Typkonvertierung in einem Ausdruck, der eine Zeichenfolge erfordert , Es wird automatisch in einen Typ konvertiert. Weitere Informationen finden Sie im Beispiel:
$bool = true; $str = 10 + "hello" echo $bool . "_" . $str ;
Zitieren der Erklärung der PHP-Dokumentation:
Die Zeichenfolge in PHP Die Implementierung ist ein Array von Bytes plus einer Ganzzahl, die die Pufferlänge angibt. Es gibt keine Informationen darüber, wie Bytes in Zeichen umgewandelt werden, die Entscheidung liegt beim Programmierer. Es gibt keine Einschränkungen hinsichtlich der Werte, aus denen eine Zeichenfolge besteht, einschließlich Bytes mit dem Wert 0, die an einer beliebigen Stelle in der Zeichenfolge erscheinen können.
PHP gibt die Codierung der Zeichenfolge nicht an. Wie die Zeichenfolge codiert wird, hängt vom Programmierer ab. Strings werden entsprechend der Codierung der PHP-Datei codiert. Wenn die Codierung Ihrer Datei beispielsweise GBK ist, ist der Inhalt Ihres Codes GBK.
Um das Konzept der binären Sicherheit zu ergänzen, kann ein Byte mit einem Wert von 0 (NULL) an jeder Position in der Zeichenfolge stehen, und einige der nicht-binären Funktionen von PHP werden als C-Funktionen bezeichnet unten, wodurch NULL gesetzt wird, nachdem Zeichen ignoriert wurden.
Solange die Dateikodierung von PHP mit ASCII kompatibel ist, können String-Operationen gut verarbeitet werden. String-Operationen sind jedoch immer noch nativer Natur (unabhängig von der Dateikodierung), daher müssen Sie bei der Verwendung darauf achten:
Einige Funktionen gehen davon aus, dass Strings einzeln kodiert sind byte , erfordert jedoch nicht, dass die Bytes als bestimmte Zeichen interpretiert werden. Zum Beispiel die Funktion sbustr().
Viele Funktionen müssen Codierungsparameter explizit übergeben, andernfalls wird der Standardwert aus der PHP.INI-Datei abgerufen, z. B. die Funktion htmlentities().
Es gibt auch einige Funktionen, die sich auf den lokalen Bereich beziehen, und diese Funktionen können nur auf einem einzelnen Byte ausgeführt werden.
Obwohl PHP intern keine Unicode-Zeichen unterstützt, unterstützt es die UTF-8-Kodierung. In den meisten Fällen wird es kein Problem geben, in den folgenden Situationen jedoch möglicherweise nicht behandelt. Hier ist:
So konvertieren Sie nicht-UTF-8-codierte Zeichenfolgen
Eine UTF-8-codierte Webseite, aber der Benutzer sendet das Formular. Manchmal kann GBK-Kodierung verwendet werden (entspricht nicht dem Meta-Tag)
Eine UTF-8-kodierte PHP-Datei, die strlen("China") verwendet, gibt 6 statt zurück die tatsächlichen Zeichen Nummer (2)
Wie kann man dieses Problem lösen? PHP bietet die mbstring-Erweiterung!
Die mbstring-Erweiterung ist standardmäßig nicht aktiviert. Sie benötigen bei der Installation --enable-mbstring.
Schauen wir uns zunächst die Konfiguration der mbstring-Direktive in PHP.INI an. Es hat lange gedauert, sie nach und nach zu verstehen.
Ich verstehe diesen Parameter mbstring.sprache als UTF-8
mbstring.internal_encoding Diese Kodierung hat nichts mit der PHP-Dateikodierung zu tun Bei den meisten MBstring-Funktionen müssen Sie die Codierung der zu verarbeitenden Zeichenfolge angeben. Wenn Sie diese nicht explizit angeben, wird der Wert dieses Parameters in höheren Versionen durch den Parameter default_charset ersetzt von PHP.
mbstring.http_input Dieser Parameter gibt die Standardkodierung der HTTP-Eingabe an (ausgenommen GET-Parameter). Der Wert dieses Parameters entspricht im Allgemeinen der Codierung der HTML-Seite und wird durch den Parameter default_charset ersetzt.
mbstring.http_output Dieser Parameter hat mich in die Irre geführt. Was ist eine HTTP-Ausgabe? Wie kann es ein solches Konzept geben?
mbstring.encoding_translation. Er ist standardmäßig deaktiviert. Wenn er aktiviert ist, konvertiert PHP automatisch die POST-Variable und den Namen der hochgeladenen Datei der von mbstring.internal_encoding angegebene Wert, aber ich habe ihn nicht getestet. Sie können eine Datei mit einem chinesischen Namen hochladen. Es wird empfohlen, es zu schließen und die damit verbundenen Probleme den Programmierern zu überlassen.
Schauen wir uns später einige durch mbstring erweiterte Funktionen an:
mb_http_input(): Erkennt die HTTP-Eingabezeichenkodierung und geht davon aus, dass es sich um die Datei handelt Name für Datei-Upload Es ist notwendig, damit umzugehen.
mb_convert_encoding(): Eine häufig verwendete Funktion. Achten Sie auf den dritten Parameter.
mb_detect_order(): Legt die Erkennungsreihenfolge der Zeichenkodierung fest/erhält sie.
mb_list_encodings(): Gibt die vom System unterstützte Codierungsliste zurück.
Wichtiger Hinweis: PHP-Dateien müssen bestimmte Kodierungen unterstützen und ASCII-kompatibel sein.
Verwenden Sie jedoch nicht BIG-5 als PHP-Dateikodierung, insbesondere wenn die Zeichenfolge in Form von Bezeichnern oder Literalen erscheint. Wenn die PHP-Dateikodierung tatsächlich BIG-5 ist, versuchen Sie, die Eingabe und zu konvertieren Inhalte in UTF-8 ausgeben.
Lassen Sie uns zum Schluss über das Konzept von Zend Multibyte sprechen. Ich verstehe es zunächst nicht mit der mbstring-Erweiterung. Der Zend-Multibyte-Modus ist standardmäßig deaktiviert und kann über den Befehl zend.multibyte aktiviert werden. Geben Sie dann die Codierung des PHP-Parsers über die Funktion „declare()“ an.
Welche Bedeutung hat dann dieser Befehl? Wie oben erwähnt, muss die Kodierung von PHP-Dateien ASCII-kompatibel sein. Was ist also mit inkompatiblen ASCII-Kodierungen wie BIG-5 zu tun? Sie können dies über diesen Befehl tun, wenn der PHP-Parser die Kodierung mbstring.script_encoding liest und diese verwendet Codierung zum Parsen von PHP-Dateien.