UTF8?
UTF16?
Verfolgen Strings in PHP auch die verwendete Kodierung?
Schauen wir uns zum Beispiel dieses Skript an. Sagen wir ich laufe:
$original = "शक्नोम्यत्तुम्";
Was passiert eigentlich?
Offensichtlich denke ich, $original
wird nicht nur 7 Zeichen enthalten. Diese Glyphen müssen dort jeweils durch mehrere Bytes dargestellt werden.
Dann mach ich:
$converted = mb_convert_encoding ($original , "UTF-8");
Was wird passieren $converted
? Wie wird $converted
anders sein als $original
?
Wird es genau dieselbe Byte-Sequenz sein, $original
aber mit einer anderen Codierung?
Antworten:
Ein PHP-String ist nur eine Folge von Bytes, der keinerlei Kodierung zugeordnet ist. Zeichenfolgenwerte können aus verschiedenen Quellen stammen: dem Client (über HTTP), einer Datenbank, einer Datei oder aus Zeichenfolgenliteralen in Ihrem Quellcode. PHP liest all diese als Byte-Sequenzen und extrahiert niemals Kodierungsinformationen.
Solange alle Datenquellen und -ziele dieselbe Codierung verwenden, kann das Schlimmste sein, dass die Zeichenfolgenpositionen falsch sind (wenn Sie Mehrbyte-Codierungen verwenden), da PHP Bytes und keine Zeichen zählt.
Wenn die Codierungen jedoch nicht übereinstimmen (z. B. wenn Sie ein Zeichenfolgenliteral in eine als UTF-8 gespeicherte Quelldatei schreiben und es dann an eine Datenbank senden, die Latin-1 erwartet), führt PHP keine Konvertierung für Sie durch Kopieren Sie die Bytes glücklich über RAW.
Die vernünftigste Lösung lautet:
Content-type
Header zu senden ).SET NAMES UTF8
in MySQL) verwendet wird.Warum UTF-8? Da es alle Unicode-Zeichen darstellen kann und somit alle vorhandenen 7-Bit- und 8-Bit-Codierungen ersetzt, und weil es binär kompatibel mit ASCII ist, ist also jede gültige ASCII-Zeichenfolge auch eine gültige UTF-8-Zeichenfolge (aber nicht vv .).
In Ihrem Beispiel passiert Folgendes.
Zunächst speichern Sie Ihre Quelldatei. Ihr Texteditor ist wahrscheinlich für die Verwendung von UTF-8 konfiguriert, sodass Ihr Zeichenfolgenliteral UTF-8-codiert auf der Festplatte erhält. PHP liest diese Datei und interpretiert den String als eine Reihe von Bytes.
$original
Enthält jetzt eine UTF-8-codierte Zeichenfolge mit 7 Zeichen, die nur eine Bytefolge ist (obwohl sie mehr als 7 Bytes enthält, da jedes Zeichen durch zwei oder mehr Bytes dargestellt wird). Wenn Sie dann anrufenecho $original
, wird die codierte Zeichenfolge unverändert an den Client gesendet. Wenn Sie dem Client mitgeteilt haben, dass er mit UTF-8 rechnen soll, ist alles in Ordnung. Wenn Sie dies jedoch nicht tun, kann PHP den Unterschied nicht feststellen, und es kommt zu einem Müll im Browser. Versuchen Sie Folgendes als Experiment:strlen
Es ist codierunabhängig und setzt eine 8-Bit-Codierung mit fester Breite voraus, dh ein Byte pro Zeichen, sodass es nur Bytes und keine Zeichen zählt.quelle