Datenspeicherung :
-
Geben Sie
utf8mb4
an Zeichensatz für alle Tabellen und Textspalten in Ihrer Datenbank. Dadurch speichert und ruft MySQL nativ in UTF-8 codierte Werte physisch ab. Beachten Sie, dass MySQL implizitutf8mb4
verwendet Codierung, wenn einutf8mb4_*
Sortierung ist angegeben (ohne expliziten Zeichensatz). -
In älteren MySQL-Versionen (<5.5.3) werden Sie leider gezwungen sein, einfach
utf8
zu verwenden , die nur eine Teilmenge von Unicode-Zeichen unterstützt. Ich wünschte, ich mache Witze.
Datenzugriff :
-
In Ihrem Anwendungscode (z. B. PHP) müssen Sie bei jeder DB-Zugriffsmethode, die Sie verwenden, den Verbindungszeichensatz auf
utf8mb4
setzen . Auf diese Weise führt MySQL keine Konvertierung von seinem nativen UTF-8 durch, wenn es Daten an Ihre Anwendung weitergibt und umgekehrt. -
Einige Treiber bieten ihren eigenen Mechanismus zum Konfigurieren des Verbindungszeichensatzes, der sowohl seinen eigenen internen Zustand aktualisiert als auch MySQL über die für die Verbindung zu verwendende Kodierung informiert – dies ist normalerweise der bevorzugte Ansatz. In PHP:
-
Wenn Sie die PDO-Abstraktionsschicht mit PHP ⥠5.3.6 verwenden, können Sie
charset
angeben im DSN:$dbh = new PDO('mysql:charset=utf8mb4');
-
Wenn Sie mysqli verwenden, können Sie
set_charset()
aufrufen :$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Wenn Sie mit einfachem MySQL nicht weiterkommen, aber PHP ⥠5.2.3 ausführen, können Sie
mysql_set_charset
aufrufen .
-
-
Wenn der Treiber keinen eigenen Mechanismus zum Festlegen des Verbindungszeichensatzes bereitstellt, müssen Sie möglicherweise eine Abfrage absetzen, um MySQL mitzuteilen, wie Ihre Anwendung die Codierung der Daten auf der Verbindung erwartet:
SET NAMES 'utf8mb4'
. -
Dieselbe Überlegung bezüglich
utf8mb4
/utf8
gilt wie oben.
Ausgabe :
- UTF-8 sollte im HTTP-Header gesetzt sein, z. B.
Content-Type: text/html; charset=utf-8
. Dies erreichen Sie entweder durch Setzen vondefault_charset
in php.ini (bevorzugt) oder manuell mitheader()
Funktion. - Wenn Ihre Anwendung Text an andere Systeme überträgt, müssen diese ebenfalls über die Zeichencodierung informiert werden. Bei Webanwendungen muss dem Browser mitgeteilt werden, in welcher Kodierung Daten gesendet werden (über HTTP-Response-Header oder HTML-Metadaten).
- Bei Codierung der Ausgabe mit
json_encode()
, fügen SieJSON_UNESCAPED_UNICODE
hinzu als zweiten Parameter.
Eingabe :
- Browser senden Daten in dem für das Dokument angegebenen Zeichensatz, daher muss bei der Eingabe nichts Besonderes getan werden.
- Falls Sie Zweifel an der Codierung von Anfragen haben (falls sie manipuliert werden könnte), können Sie jeden empfangenen String als gültiges UTF-8 überprüfen, bevor Sie versuchen, ihn zu speichern oder irgendwo zu verwenden.
mb_check_encoding()
von PHP macht den Trick, aber Sie müssen es religiös verwenden. Daran führt wirklich kein Weg vorbei, da böswillige Clients Daten in beliebiger Codierung übermitteln können, und ich habe keinen Trick gefunden, um PHP dazu zu bringen, dies zuverlässig für Sie zu tun.
Andere Überlegungen zum Kodex :
-
Offensichtlich sollten alle Dateien, die Sie bereitstellen (PHP, HTML, JavaScript usw.), in gültigem UTF-8 codiert sein.
-
Sie müssen sicherstellen, dass Sie jedes Mal, wenn Sie eine UTF-8-Zeichenfolge verarbeiten, dies sicher tun. Das ist leider der schwierige Teil. Wahrscheinlich möchten Sie PHPs
mbstring
ausgiebig nutzen Erweiterung. -
Die in PHP integrierten Zeichenfolgenoperationen sind nicht standardmäßig UTF-8 sicher. Es gibt einige Dinge, die Sie sicher mit normalen PHP-String-Operationen tun können (wie Verkettung), aber für die meisten Dinge sollten Sie das Äquivalent
mbstring
verwenden Funktion. -
Um zu wissen, was Sie tun (sprich:es nicht vermasseln), müssen Sie UTF-8 wirklich kennen und wissen, wie es auf der niedrigstmöglichen Ebene funktioniert. Sehen Sie sich einen der Links von utf8.com an, um einige gute Ressourcen zu finden und alles zu erfahren, was Sie wissen müssen.
Zusätzlich zur Einstellung von default_charset
in der php.ini können Sie mit header()
den korrekten Zeichensatz senden aus Ihrem Code, vor jeder Ausgabe:
header('Content-Type: text/html; charset=utf-8');
Das Arbeiten mit Unicode in PHP ist einfach, solange Sie wissen, dass die meisten der String-Funktionen nicht mit Unicode funktionieren und manche Strings vollständig verstümmeln . PHP betrachtet "Zeichen" als 1 Byte lang. Manchmal ist das in Ordnung (zum Beispiel sucht explode() nur nach einer Bytefolge und verwendet sie als Trennzeichen – es spielt also keine Rolle, nach welchen tatsächlichen Zeichen Sie suchen). Aber manchmal, wenn die Funktion eigentlich dafür ausgelegt ist, mit Zeichen zu arbeiten , PHP hat keine Ahnung, dass Ihr Text Multibyte-Zeichen enthält, die mit Unicode gefunden werden.
Eine gute Bibliothek zum Einchecken ist phputf8. Dadurch werden alle "schlechten" Funktionen neu geschrieben, sodass Sie sicher mit UTF8-Zeichenfolgen arbeiten können. Es gibt Erweiterungen wie die mb_string-Erweiterung, die dies auch für Sie tun, aber ich bevorzuge die Verwendung der Bibliothek, weil sie portabler ist (aber ich schreibe Produkte für den Massenmarkt, also ist das wichtig für mich). Aber phputf8 kann mb_string trotzdem hinter den Kulissen verwenden, um die Leistung zu steigern.
Ich möchte der ausgezeichneten Antwort von chazomaticus noch eine Sache hinzufügen:
Vergessen Sie auch nicht das META-Tag (wie dieses oder die HTML4- oder XHTML-Version davon):
<meta charset="utf-8">
Das scheint trivial, aber IE7 hat mir damit schon früher Probleme bereitet.
Ich habe alles richtig gemacht; die Datenbank, die Datenbankverbindung und der Content-Type-HTTP-Header waren alle auf UTF-8 eingestellt, und es funktionierte gut in allen anderen Browsern, aber der Internet Explorer bestand immer noch darauf, die "westeuropäische" Kodierung zu verwenden.
Es stellte sich heraus, dass auf der Seite das META-Tag fehlte. Das Hinzufügen löste das Problem.
Bearbeiten:
Das W3C hat tatsächlich einen ziemlich großen Abschnitt, der I18N gewidmet ist. Sie haben eine Reihe von Artikeln zu diesem Thema, die die HTTP-, (X)HTML- und CSS-Seite der Dinge beschreiben:
- FAQ:Ändern der (X)HTML-Seitencodierung in UTF-8
- Zeichencodierungen in HTML deklarieren
- Tutorial:Zeichensätze und Kodierungen in XHTML, HTML und CSS
- Festlegen des HTTP-Zeichensatzparameters
Sie empfehlen die Verwendung sowohl des HTTP-Headers als auch des HTML-Meta-Tags (oder der XML-Deklaration, falls XHTML als XML bereitgestellt wird).