Suche…
Bemerkungen
Sie müssen sicherstellen, dass Sie bei jeder Verarbeitung eines UTF-8-Strings sicher arbeiten. Dies ist leider der schwierige Teil. Wahrscheinlich möchten Sie die
mbstring
Erweiterung von PHP ausgiebig nutzen.PHP integrierte String - Operationen sind nicht standardmäßig UTF-8 sicher. Es gibt einige Dinge, die Sie mit normalen PHP-Zeichenfolgenoperationen (z. B. Verkettung)
mbstring
können. Für die meisten Dinge sollten Sie jedoch die entsprechende Funktionmbstring
verwenden.
Eingang
Sie sollten jeden empfangenen String als gültiges UTF-8 prüfen, bevor Sie ihn speichern oder irgendwo verwenden.
mb_check_encoding()
PHP macht den Trick, aber Sie müssen es konsequentmb_check_encoding()
. Es gibt wirklich keinen Ausweg, da bösartige Kunden Daten in beliebiger Kodierung übermitteln können.$string = $_REQUEST['user_comment']; if (!mb_check_encoding($string, 'UTF-8')) { // the string is not UTF-8, so re-encode it. $actualEncoding = mb_detect_encoding($string); $string = mb_convert_encoding($string, 'UTF-8', $actualEncoding); }
Wenn Sie HTML5 verwenden, können Sie diesen letzten Punkt ignorieren. Sie möchten, dass alle Daten, die von Browsern an Sie gesendet werden, UTF-8 enthalten. Der einzige zuverlässige Weg, dies zu tun, besteht darin, das Attribut "
accept-charset
zu allen Ihren<form>
-Tags hinzuzufügen.<form action="somepage.php" accept-charset="UTF-8">
Ausgabe
Wenn Ihre Anwendung Text an andere Systeme überträgt, müssen sie auch über die Zeichenkodierung informiert werden. In PHP können Sie die Option
default_charset
inphp.ini
oder denContent-Type
MIME-Header manuell ausgeben. Dies ist die bevorzugte Methode, wenn Sie auf moderne Browser zugreifen.header('Content-Type: text/html; charset=utf-8');
Wenn Sie die Antwortheader nicht festlegen können, können Sie auch die Codierung in einem HTML-Dokument mit HTML-Metadaten festlegen.
HTML5
<meta charset="utf-8">
Ältere Versionen von HTML
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Datenspeicherung und -zugriff
In diesem Thema wird speziell auf UTF-8 und Überlegungen zur Verwendung mit einer Datenbank eingegangen. Wenn Sie weitere Informationen zur Verwendung von Datenbanken in PHP wünschen, lesen Sie dieses Thema .
Daten in einer MySQL-Datenbank speichern:
-
utf8mb4
denutf8mb4
Zeichensatz für alle Tabellen und Textspalten in Ihrer Datenbank an. Dadurch werden in MySQL in UTF-8 nativ kodierte Werte physisch gespeichert und abgerufen.MySQL verwendet die
utf8mb4
Codierung implizit, wenn eineutf8mb4_*
angegeben wird (ohne expliziten Zeichensatz). - Ältere Versionen von MySQL (<5.5.3) unterstützen
utf8mb4
nicht.utf8mb4
Sieutf8
, das nur eine Teilmenge von Unicode-Zeichen unterstützt.
Zugriff auf Daten in einer MySQL-Datenbank:
In Ihrem Anwendungscode (z. B. PHP) müssen Sie bei der von Ihnen verwendeten DB-Zugriffsmethode den Verbindungszeichensatz auf
utf8mb4
. Auf diese Weise führt MySQL keine Konvertierung vom nativen UTF-8 durch, wenn Daten an Ihre Anwendung übergeben werden und umgekehrt.Einige Treiber bieten einen eigenen Mechanismus zum Konfigurieren des Verbindungszeichensatzes, der sowohl den eigenen internen Status aktualisiert als auch MySQL über die Codierung informiert, die für die Verbindung verwendet werden soll. Dies ist normalerweise der bevorzugte Ansatz.
Zum Beispiel (Die gleiche Überlegung bezüglich
utf8mb4
/utf8
gilt wie oben):Wenn Sie die PDO- Abstraktionsschicht mit PHP ≥ 5.3.6 verwenden, können Sie im DSN einen
charset
angeben:$handle = new PDO('mysql:charset=utf8mb4');
Wenn Sie mysqli verwenden , können Sie
set_charset()
aufrufen:$conn = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db'); $conn->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($conn, 'utf8mb4'); // procedural style
Wenn Sie mit einfachen stecken mysql aber passieren zu laufen PHP ≥ 5.2.3, können Sie rufen
mysql_set_charset
.$conn = mysql_connect('localhost', 'my_user', 'my_password'); $conn->set_charset('utf8mb4'); // object oriented style mysql_set_charset($conn, 'utf8mb4'); // procedural style
Wenn der Datenbanktreiber keinen eigenen Mechanismus zum Festlegen des Verbindungszeichensatzes bereitstellt, müssen Sie MySQL möglicherweise eine Abfrage ausgeben, wie Ihre Anwendung die zu verschlüsselnden Daten der Verbindung erwartet:
SET NAMES 'utf8mb4'
.