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 Versionen von MySQL (<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 das PDO verwenden Abstraktionsschicht mit PHP ≥ 5.3.6 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 zufällig PHP ≥ 5.2.3 ausführen, können Sie
mysql_set_charset .
-
-
Wenn der Treiber keinen eigenen Mechanismus zum Festlegen des Verbindungszeichensatzes bereitstellt, müssen Sie MySQL möglicherweise mit einer Abfrage mitteilen, wie Ihre Anwendung Daten auf der Verbindung erwartet, die codiert werden sollen:
SET NAMES 'utf8mb4'
. -
Die gleiche Überlegung bezüglich
utf8mb4
/utf8
gilt wie oben.
Ausgabe :
-
Wenn Ihre Anwendung Text an andere Systeme übermittelt, müssen diese ebenfalls über die Zeichenkodierung informiert werden. Bei Webanwendungen muss dem Browser mitgeteilt werden, in welcher Kodierung Daten gesendet werden (über HTTP-Response-Header oder HTML-Metadaten ).
-
In PHP können Sie den
default_charset verwenden
php.ini-Option oder geben Sie denContent-Type
manuell ein MIME-Header selbst, was nur mehr Arbeit ist, aber den gleichen Effekt hat. -
Beim Codieren der Ausgabe mit
json_encode()
, fügen SieJSON_UNESCAPED_UNICODE
hinzu als zweiten Parameter.
Eingabe :
-
Leider sollten Sie jede empfangene Zeichenfolge auf gültiges UTF-8 überprüfen, bevor Sie versuchen, sie zu speichern oder irgendwo zu verwenden. PHPs
mb_check_encoding()
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. -
Aus meiner Lektüre der aktuellen HTML-Spezifikation , sind die folgenden Unterpunkte für modernes HTML nicht mehr erforderlich oder sogar gültig. Mein Verständnis ist, dass Browser mit dem für das Dokument angegebenen Zeichensatz arbeiten und Daten in diesem übermitteln. Wenn Sie jedoch auf ältere HTML-Versionen (XHTML, HTML4 usw.) abzielen, können diese Punkte dennoch nützlich sein:
- Nur für HTML vor HTML5 :Sie möchten, dass alle Daten, die Ihnen von Browsern gesendet werden, in UTF-8 vorliegen. Leider ist die einzige Möglichkeit, dies zuverlässig zu tun, das Hinzufügen des
accept-charset
Attribut für alle IhreTags:
.
- Nur für HTML vor HTML5 :Beachten Sie, dass die W3C-HTML-Spezifikation besagt, dass Clients standardmäßig Formulare in dem vom Server bereitgestellten Zeichensatz an den Server zurücksenden "sollten", aber dies ist anscheinend nur eine Empfehlung, daher die Notwendigkeit, bei jedem einzelnen
Tag.
- Nur für HTML vor HTML5 :Sie möchten, dass alle Daten, die Ihnen von Browsern gesendet werden, in UTF-8 vorliegen. Leider ist die einzige Möglichkeit, dies zuverlässig zu tun, das Hinzufügen des
Weitere Ü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 ausgiebig Gebrauch von
mbstring
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 den entsprechenden
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. Schauen Sie sich einen der Links von utf8.com an für einige gute Ressourcen, um alles zu lernen, was Sie wissen müssen.