Ich habe in letzter Zeit viele Artikel zum Thema Codierung gelesen, daher habe ich sie in zwei Blog-Beiträge unterteilt, um über Wissen zum Thema „PHP, Strings, Codierung, UTF-8“ zu sprechen. Dieser Blog-Beitrag ist die erste Hälfte und ist in vier Hauptteile unterteilt. nämlich „Definition und Verwendung von Strings“, „String-Konvertierung“, „Die Natur von PHP-Strings“, „Multibyte-Strings“. Die erste Hälfte ist relativ einfach und der nächste Artikel „Best Practices von PHP und UTF-8“ enthält möglicherweise weitere Informationen.
Strings können in PHP auf vier Arten festgelegt werden:
Einfache Zeichenfolge in Anführungszeichen
Zeichenfolgen in einfachen Anführungszeichen ähneln Rohzeichenfolgen in Python, was bedeutet, dass Zeichenfolgen in einfachen Anführungszeichen keine Funktionen zum Parsen von Variablen und keine Escape-Funktionen für Sonderzeichen haben. Beispielsweise verfügt $str='hellonworld', n darin über keine Newline-Funktion.
Zeichenfolge in doppelten Anführungszeichen
Zeichenfolgen in doppelten Anführungszeichen verfügen über Funktionen zum Parsen von Variablen und Escape-Funktionen für Sonderzeichen, über die Zeichenfolgen in einfachen Anführungszeichen nicht verfügen.
Persönlich interessiere ich mich sehr für die spezielle Escape-Funktion von Hexadezimal- und Oktalzeichenfolgen. Besonderer Zusatz:
\[0-7]{1,3} #八进制表达方式 \x[0-9A-Fa-f]{1,2} #十六进制表达方式
heredoc
Dieser Ausdruck ähnelt 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.
Variablenanalyse
Der leistungsstärkste Teil von PHP-Strings ist das Parsen von Variablen, mit dem Variablen zur Laufzeit entsprechend dem Kontext analysiert werden können (dies ist eine interpretierte Sprache), was viele wunderbare Verwendungsmöglichkeiten bieten kann.
Einfaches Parsen von Variablen bedeutet, dass die Zeichenfolge „Variablen“, „Arrays“ und „Objekteigenschaften“ enthalten kann. Komplexe Syntaxregeln bestehen darin, {}-Symbole zu verwenden (einen Ausdruck zu bilden).
Sehen wir uns die Leistungsfähigkeit des Variablenparsings anhand eines Beispiels an
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 Typkonvertierung, die viele Vorgänge vereinfacht, was hier anhand der String-Konvertierung erläutert wird.
String-Typ-Zwang
$var = 10 ; $dvar = (string)$var ; echo $dvar . "_" . gettype($dvar);
Die Funktion strval() dient zum Abrufen des Zeichenfolgenwerts der Variablen:
$var = 10.2 ; $dvar = strval($var) ; echo gettype($var) . "_" . $dvar . "_" . gettype($dvar);
Die Funktion settype() legt den Typ der Variablen fest:
$str = "10hello"; settype($str, "integer"); echo $str ;
Während des Prozesses der erzwungenen Typkonvertierung werden bestimmte Regeln befolgt, wenn andere Wertetypen in Zeichenfolgen umgewandelt werden. Beispielsweise wird ein boolescher Wert von TRUE in eine Zeichenfolge von „1“ umgewandelt. Es ist am besten, die relevanten Regeln zu verstehen.
Automatische Typkonvertierung
Bei den oben genannten Konvertierungen handelt es sich um Anzeigekonvertierungen. Wichtiger ist die automatische Typkonvertierung. In einem Ausdruck, der eine Zeichenfolge erfordert, wird diese automatisch in einen Typ konvertiert:
$bool = true; $str = 10 + "hello" echo $bool . "_" . $str ;
Zitieren der Erklärung aus der PHP-Dokumentation:
String wird in PHP als Array aus Bytes plus einer Ganzzahl implementiert, 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 legt die Kodierung des Strings nicht fest. Wie der String kodiert 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 dem Wert 0 (NULL) an jeder Position in der Zeichenfolge stehen, und einige der nicht-binären Funktionen von PHP werden unten als C-Funktionen bezeichnet, die die Zeichen nach NULL ignorieren .
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 Zeichenfolgen in einzelnen Bytes kodiert sind, erfordern jedoch nicht, dass die Bytes als bestimmte Zeichen interpretiert werden. Zum Beispiel die Funktion sbustr().
Viele Funktionen müssen Codierungsparameter explizit übergeben, andernfalls werden die Standardwerte aus der PHP.INI-Datei abgerufen, beispielsweise die Funktion htmlentities().
Es gibt auch einige Funktionen, die sich auf den lokalen Bereich beziehen, und diese Funktionen können nur mit einem einzelnen Byte arbeiten.
Unter normalen Umständen unterstützt PHP zwar intern keine Unicode-Zeichen, jedoch die UTF-8-Kodierung. In den meisten Fällen treten jedoch keine Probleme auf:
So konvertieren Sie nicht UTF-8-codierte Zeichenfolgen
Eine UTF-8-codierte Webseite, aber wenn Benutzer das Formular absenden, verwenden sie möglicherweise GBK-Codierung (die nicht mit Meta-Tags übereinstimmt)
Eine UTF-8-codierte PHP-Datei, die strlen("China") verwendet, gibt 6 anstelle der tatsächlichen Anzahl von Zeichen (2) zurück
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 den Parameter mbstring.sprache als UTF-8
mbstring.internal_encoding Diese Kodierung hat nichts mit der PHP-Dateikodierung zu tun. In den meisten mbstring-Funktionen müssen Sie lediglich die Kodierung der zu verarbeitenden Zeichenfolge angeben Der Wert dieses Parameters wird in höheren PHP-Versionen standardmäßig abgerufen.
mbstring.http_input Dieser Parameter gibt die Standardkodierung für HTTP-Eingaben 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 PHP-Ausgabe? Wie kann es ein solches Konzept geben?
mbstring.encoding_translation, konzentrieren wir uns auf diesen Parameter. Wenn er aktiviert ist, konvertiert PHP die Codierung der POST-Variablen und den Namen der hochgeladenen Datei automatisch in den durch mbstring.internal_encoding angegebenen Wert , ich habe es nicht getestet. Sie können eine Datei mit chinesischem 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(): Erkennen Sie die HTTP-Eingabezeichenkodierung und halten Sie sie für erforderlich, um den Dateinamen des Datei-Uploads zu verarbeiten.
mb_convert_encoding(): Eine häufig verwendete Funktion. Achten Sie auf den dritten Parameter.
mb_detect_order(): Setzt/ruft die Erkennungsreihenfolge der Zeichenkodierung ab.
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 tatsächliche PHP-Dateikodierung BIG-5 ist, versuchen Sie, den Eingabe- und Ausgabeinhalt in UTF-8 zu konvertieren .
Lassen Sie uns abschließend ü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 diese Anweisung? 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.
Das Obige ist eine detaillierte Erklärung der Zeichenfolgen, Codierungen und UTF-8-Codes in PHP. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (m.sbmmt.com).