UTF-8 den ganzen Weg durch
Ich bin die Einrichtung eines neuen server und wollen zur Unterstützung der UTF-8-voll und ganz in meiner web-Anwendung. Ich habe versucht, dies in der Vergangenheit auf bestehenden Servern und scheinen immer am Ende mit fallback auf ISO-8859-1.
Wo genau muss ich die Codierung/charsets? Ich bin mir bewusst, dass ich brauche, um zu konfigurieren, Apache, MySQL und PHP, dies zu tun — gibt es eine standard-Checkliste, die ich Folgen können, oder vielleicht beheben, wo die Abweichungen auftreten?
Dies ist für einen neuen Linux-server mit MySQL 5, PHP 5 und Apache 2.
Hier ist eine übersicht über alle encoding-Fehler Sie können möglicherweise machen: sebastianviereck.de/en/...
Hier ist eine Einführung in die Codierungen im Allgemeinen und Kodierungen in PHP im besonderen: Was Jeder Programmierer Absolut Positiv Muss Wissen Über Kodierungen Und Zeichensätzen Arbeiten Mit Text
Einige der jüngsten Diskussionen zu PHP 7 zeigen, dass es keine änderungen in der "offiziell aufgegeben" position 2010... Es gibt etwas mehr über "PHP7 und UTF-8"?
Dieses problem ist üblich. Aber es gibt keine shortcut-Lösung haben Sie, um das setup
Hier ist eine Einführung in die Codierungen im Allgemeinen und Kodierungen in PHP im besonderen: Was Jeder Programmierer Absolut Positiv Muss Wissen Über Kodierungen Und Zeichensätzen Arbeiten Mit Text
Einige der jüngsten Diskussionen zu PHP 7 zeigen, dass es keine änderungen in der "offiziell aufgegeben" position 2010... Es gibt etwas mehr über "PHP7 und UTF-8"?
Dieses problem ist üblich. Aber es gibt keine shortcut-Lösung haben Sie, um das setup
utf-8
für jeden von Ihnen getrennt - MySQL 5, PHP 5 ODER Apache 2.InformationsquelleAutor mercutio | 2008-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Datenspeicherung:
Geben Sie die
utf8mb4
Zeichensatz auf alle Tabellen und text-Spalten in Ihrer Datenbank. Das macht MySQL physisch speichern und abrufen von Werten kodiert standardmäßig in UTF-8. Beachten Sie, dass MySQL implizitutf8mb4
- Codierung, wenn einutf8mb4_*
Sortierung angegeben ist (ohne explizite Zeichensatz).In älteren Versionen von MySQL (< 5.5.3), wirst du leider gezwungen sein, verwenden Sie einfach
utf8
, unterstützt nur eine Teilmenge von Unicode-Zeichen. Ich wünschte, ich wäre ein Scherz.Data Access:
In Ihrer Anwendung code (z.B. PHP), in welcher DB-Zugriffs Methode, die Sie verwenden, müssen Sie die Verbindung charset
utf8mb4
. Auf diese Weise, MySQL unterstützt keine Konvertierung von seiner nativen UTF-8, wenn es die Hände von Daten aus Ihrer Anwendung und Umgekehrt.Einige Treiber unterstützen Ihren eigenen Mechanismus für die Konfiguration der Verbindungs-Zeichensatz, der die beiden updates den eigenen internen Zustand und informiert MySQL von der Codierung werden für die Verbindung verwendet—das ist in der Regel der bevorzugte Ansatz. In PHP:
Wenn Sie mit der PDO abstraction layer mit PHP ≥ 5.3.6, können Sie angeben
charset
im DSN:Wenn Sie mysqli, können Sie rufen Sie
set_charset()
:Wenn Sie stecken mit einfachen mysql aber zufällig PHP ≥ 5.2.3, können Sie rufen Sie
mysql_set_charset
.Wenn der Fahrer nicht seinen eigenen Mechanismus für die Einstellung der Verbindung Zeichensatz, die Sie haben können, um eine Abfrage zu erzählen MySQL, wie Ihre Anwendung erwartet wird, dass Daten über die Verbindung verschlüsselt sein:
SET NAMES 'utf8mb4'
.Die gleiche überlegung bezüglich
utf8mb4
/utf8
gilt wie oben.Ausgabe:
Wenn Ihre Anwendung sendet text an andere Systeme, werden Sie auch brauchen, um informiert zu sein, die Zeichenkodierung. Mit web-Anwendungen, der browser muss mitgeteilt werden, die Kodierung, in der die Daten gesendet (über den HTTP-Antwort-Headern oder HTML-Metadaten).
In PHP, die Sie verwenden können, die
- default_charset
php.ini-option oder manuell dieContent-Type
MIME-header selbst, die nur mehr Arbeit, hat aber den gleichen Effekt.Bei der Codierung der Ausgabe mit
json_encode()
fügen SieJSON_UNESCAPED_UNICODE
als zweiten parameter.Eingang:
Leider, sollten Sie überprüfen, ob jede empfangene Zeichenkette als gültiges UTF-8, bevor Sie versuchen, zu speichern oder verwenden Sie es überall. PHP ist
mb_check_encoding()
funktioniert der trick, aber Sie müssen verwenden Sie es religiös. Es gibt wirklich keinen Weg, um dieses zu verwenden, da böswillige clients können Daten übermitteln, in welcher Codierung Sie wollen, und ich habe nicht gefunden ein trick, um PHP zu tun, das für Sie zuverlässig.Aus meiner Lektüre der aktuellen HTML-spec, die folgende sub-Kugeln sind nicht notwendig oder sogar mehr gültig, die für moderne HTML. Mein Verständnis ist, dass der Browser arbeiten mit und senden von Daten, die in dem Zeichensatz für das Dokument angegeben wurde. Allerdings, wenn Sie eine Ausrichtung auf ältere Versionen von HTML (XHTML, HTML4, etc.), diese Punkte können noch nützlich sein:
accept-charset
- Attribut auf alle Ihre<form>
tags:<form ... accept-charset="UTF-8">
.<form>
tag.Anderen Code Überlegungen:
Offensichtlich genug, alle Dateien werden Sie eine portion (PHP, HTML, JavaScript, etc.) codiert werden sollten, gültig UTF-8.
Müssen Sie sicherstellen, dass jedes mal, wenn Sie eine UTF-8-string, so tun Sie dies sicher. Das ist leider der schwierige Teil. Sie werden wahrscheinlich wollen, um umfangreiche Verwendung von PHP ' s
mbstring
Erweiterung.PHP ' s built-in string-Operationen sind nicht standardmäßig UTF-8 sicher. Es gibt einige Dinge, die Sie können sicher tun, mit normalen PHP-string-Operationen (wie z.B. Verkettung), aber für die meisten Dinge, die Sie verwenden sollten, die äquivalente
mbstring
Funktion.Wissen, was Sie tun (Lesen: nicht Durcheinander it up), die Sie wirklich brauchen, zu wissen, UTF-8 und wie es arbeitet auf der niedrigsten möglichen Ebene. Schauen Sie sich jede der links von utf8.com für einige gute Ressourcen, um zu lernen alles, was Sie brauchen, um wissen.
Ich bin nicht falsch: COLLATE impliziert Zeichensatz. Siehe z.B. dev.mysql.com/doc/refman/5.0/en/charset-database.html.
Sollten Sie erwägen PDO Beispiele für die Einstellung der Zeichensatz als gut.
Beachten Sie, dass MySQL nicht die gleiche Sprache sprechen wie alle anderen auch. Wenn MySQL sagt, "utf8" es wirklich bedeutet, "etwas unheimlich verzögert Variante von UTF-8, welches nur aus drei bytes, die für Gott weiß was lächerlicher Grund". Wenn Sie wirklich wollen, UTF-8 sollte man sagen, MySQL, dass Sie wollen, dass diese seltsame Sache, die MySQL-gerne call - utf8mb4. Kümmern Sie sich nicht speichern auf der "WTF!".
Diese Antwort hat mir geholfen, so viel, ABER ich habe auch festgestellt, dass in meinem Fall brauchte ich hinzufügen JSON_UNESCAPED_UNICODE zu meiner PHP-Funktionen json_encode bei der übergabe der DB-Abfrage die Ergebnisse wieder per ajax.
InformationsquelleAutor chazomaticus
Ich möchte eine Sache hinzufügen, um chazomaticus' ausgezeichnete Antwort:
Vergessen Sie nicht, die META-tag entweder (wie dieser, oder die HTML4-oder XHTML-version):
Scheint trivial, aber IE7 hat mir Probleme mit diesem vor.
Ich mache alles richtig, die Datenbank, die Datenbank-Anbindung und Content-Type-HTTP-header waren alle auf UTF-8 eingestellt, und es funktionierte gut in allen anderen Browsern, Internet Explorer aber immer noch darauf bestanden, die "Western European" - Codierung.
Es stellte sich heraus der Seite fehlte das META-tag. Hinzufügen, dass das problem gelöst.
Edit:
Das W3C hat tatsächlich eine ziemlich große Abschnitt gewidmet, um I18N. Sie haben eine Reihe von Artikeln im Zusammenhang mit diesem Problem – Beschreibung des HTTP, (X)HTML-und CSS-Seite der Dinge:
Sie empfehlen sowohl die HTTP-header und HTML-meta-tag (oder XML-Deklaration bei XHTML diente als XML).
Ja, Sie können senden Sie es an die HTTP-header, aber es ist besser, senden Sie es an die Inhalte, denn wenn der client speichert die Datei, es werden immer speichern Sie die meta-tag. Ein HTTP-header wird wahrscheinlich einfach verschwinden, es sei denn, der browser ist intelligent genug, um zu kopieren, es in einen meta-tag in der Datei gespeichert.
Auch, stellen Sie sicher, dass line ist das erste Kind des head-Elements (vor der Unicode-Zeugs). Der browser kann geben die Seite nach dem Auftreffen auf das meta-element wie oben beschrieben.
hi dude, ich bin Anfänger in web-Entwicklung und Stand vor dem gleichen Problem, bei dem Versuch, ändern Sie die Sprache formatiertes Datum Zeit Stand ich vor diesem Problem 10 �������� 2018, ich bin mit utf-8 in html-und ich wurde angedeutet, Datenbank-und browser-kompatibel mit utf-8, damit ich mein problem lösen kann. Bitte können Sie mir helfen. Ich hoffe für Ihre Aufmerksamkeit
Ich bin PHP Laravel
InformationsquelleAutor mercator
Neben der Einstellung
default_charset
in php.ini, können Sie das richtige charset verwendenheader()
in Ihrem code, bevor irgendeine Ausgabe:Arbeiten mit Unicode-Zeichensätze in PHP ist einfach, solange Sie wissen, dass die meisten der string-Funktionen arbeiten nicht mit Unicode, und einige könnten mangle Saiten komplett. PHP Auffassung, "Figuren" 1 byte lang. Manchmal ist das okay (zum Beispiel
explode()
sieht nur eine byte-Sequenz und nutzt es als separator -- es ist also egal, was die tatsächlichen Zeichen, die Sie suchen). Aber zu anderen Zeiten, wenn die Funktion tatsächlich entwickelt, um auf Zeichen, PHP hat keine Ahnung, dass Ihr text ist multi-byte-Zeichen, die gefunden werden, mit Unicode.Einer guten Bibliothek zu überprüfen ist phputf8. Dieser schreibt alle von "schlecht" - Funktionen, so können Sie sicher arbeiten auf UTF8-strings. Es gibt Erweiterungen wie die mbstring-Erweiterung, die versuchen, dies für Sie tun, auch, aber ich bevorzuge die Bibliothek, weil es mehr tragbar (aber ich Schreibe Massenmarkt-Produkte also, die für mich wichtig). Aber phputf8 können mbstring hinter den kulissen sowieso, um die Leistung zu erhöhen.
InformationsquelleAutor chroder
Altes Thema, ich weiß. Gefunden ein Problem mit jemandem mit PDO und die Antwort war dies für die PDO-Connection string:
Die Website habe ich diese von unten ist, war in der Lage, um es über google cache zum Glück.
$dbh->exec("set names utf8");
; ich bevorzuge die Methode, die hier vorgestellt). Btw. es gibt auch einen ähnlichen Hinweis auf diese als Kommentar im PHP-manual: php.net/manual/en/pdo.construct.php#96325.InformationsquelleAutor Brad F Jacobs
In meinem Fall, ich war mit
mb_split
verwendet regex. Daher musste ich auch manuell sicherstellen, dass die regex-Kodierung wurde utf-8-by-doing -mb_regex_encoding('UTF-8');
Als seitliche Anmerkung, ich entdeckte auch, dass durch die Ausführung
mb_internal_encoding()
dass die interne Codierung war nicht utf-8, und das habe ich geändert, das durch Ausführungmb_internal_encoding("UTF-8");
.InformationsquelleAutor JDelage
Erste von allen, wenn Sie in < PHP 5.3 dann nicht. Sie haben eine Menge von Problemen zu bewältigen.
Ich bin überrascht, dass niemand erwähnt hat das mi Bibliothek, die eine, die hat gute Unterstützung für unicode, Grapheme, string-Operationen , Lokalisierung und viele mehr, siehe unten.
Ich zitiere einige Informationen über unicode-Unterstützung in PHP Elizabeth Smith Folien bei PHPBenelux'14
INTL
Gut:
Schlecht:
mb_string
ICONV
stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')
DATENBANKEN
Einige andere Fallstricke
Ich ll aktualisieren Sie diese Antwort im Fall Dinge ändern sich, neue features und so weiter.
--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
Optionen.InformationsquelleAutor Jimmy Kane
Vor kurzem habe ich entdeckt, dass die Verwendung
strtolower()
Probleme verursachen können, wo die Daten abgeschnitten, nachdem Ihr einen besonderen Charakter.Die Lösung war die Verwendung
InformationsquelleAutor Notflip
Das einzige, was ich hinzufügen würde, um diese erstaunliche Antworten ist zu betonen, über das speichern Ihrer Dateien in utf8-Codierung, habe ich bemerkt, dass Browser akzeptieren diese Eigenschaft über die Einstellung utf-8 als dein code-Codierung. Jeder vernünftige text-editor, zeigen Sie dies, beispielsweise Notepad++ hat eine Menü-option für Datei-enconding, es zeigt dir die aktuelle Codierung und ermöglicht es Ihnen, es zu ändern. Für alle meine php-Dateien verwende ich utf-8 ohne BOM.
Irgendwann hatte ich jemanden bitten, mich zu fügen Sie den utf-8-Unterstützung für php/mysql-Anwendung entwickelt, die von jemand anderem, ich habe bemerkt, dass alle Dateien wurden in ANSI kodiert, so musste ich ICONV zu konvertieren alle Dateien, ändern Sie die Tabellen der Datenbank mit dem utf8-charset und collate utf8_general_ci, add 'SET NAMES utf8', um die Datenbank-Abstraktions-Schicht nach dem Anschluss (bei Verwendung 5.3.6 oder früher wenn nicht, verwenden Sie charset=utf8 " in der Verbindungszeichenfolge) und ändern von string-Funktionen zu benutzen, die php multibyte-string-Funktionen entspricht.
InformationsquelleAutor Puerto AGP
In PHP, müssen Sie entweder die multibyte-Funktionen, oder schalten Sie mbstring.func_overload. Dass so Sachen wie strlen arbeiten, wenn Sie Zeichen, die mehr als ein byte.
Müssen Sie identifizieren Sie den Zeichensatz für Ihre Antworten. Sie können entweder AddDefaultCharset, wie oben, oder schreiben Sie PHP-code, gibt den header. (Oder fügen Sie ein META-tag Ihrer HTML-Dokumente.)
Nur vorsichtig sein-einige code könnte in der Tat sein, sich auf die ein-byte-pro-Zeichen-Natur-der standard-string-Funktionen.
Wichtig zu beachten, dass die mbstring.func_overload feature ist als veraltet markiert, da der PHP-7.2 aufgrund der Probleme notiert @JW ' s Kommentar oben. Also der beste Rat ist: ja, Sie sollten auf jeden Fall verwenden, solange die mbstring-Funktionen, aber nicht die overload-Funktion, um die standard-Funktionen arbeiten als multibyte.
InformationsquelleAutor JW.
Ich ging gerade durch das gleiche Problem und eine gute Lösung gefunden auf die PHP-manuals.
Änderte ich alle meine Datei-Kodierung auf UTF8 dann die Standard-Kodierung auf meine Verbindung. Diese alle Probleme gelöst.
View Source
set_charset('utf8mb4')
hat nicht funktioniert, aber>set_charset("utf8")
hat und das war nicht wirklich gezeigt in den anderen Antworten.Achtung:
set_charset("utf8")
können funktionieren, werden aber anders Verhalten (siehe die Bemerkungen über den Unterschied zwischenutf8
undutf8mb4
und die mysql-version der Geschichte). Verwendenutf8
wenn Sie UND NUR , wenn Sie wissen, was Sie tun!InformationsquelleAutor Abdul Sadik Yalcin
Unicode-Unterstützung in PHP ist immer noch ein großes Durcheinander. Während es ist in der Lage Umwandlung einer ISO8859-string (die intern verwendet wird) nach utf8, es fehlt die Fähigkeit zum arbeiten mit unicode-strings nativ, was bedeutet, dass alle string-Verarbeitung Funktionen zerfleischen und beschädigt Ihre Saiten. So haben Sie entweder eine eigene Bibliothek für die korrekte utf8-Unterstützung, oder schreiben die alle das string-handling-Funktionen selbst.
Ist der einfache Teil ist nur die Angabe des charset in HTTP-Header und in der Datenbank und so, aber nichts davon zählt, wenn PHP-code nicht ausgegeben gültige UTF8. Das ist der schwierige Teil, und PHP gibt Sie praktisch keine Hilfe gibt. (Ich denke, PHP6 soll fix das Schlimmste, sondern es ist noch eine Weile entfernt)
InformationsquelleAutor jalf
Die top-Antwort ist sehr gut. Hier ist, was ich hatte, um auf einer regelmäßigen debian/php/mysql-setup:
war, dass alle !
InformationsquelleAutor commonpike
Wenn Sie möchten, dass der MySQL-server entscheiden, Zeichensatz, und nicht PHP als client (das alte Verhalten bevorzugt, meiner Meinung nach), versuchen Sie
skip-character-set-client-handshake
zu Ihremmy.cnf
unter[mysqld]
, und starten Siemysql
.Dies kann Störungen verursachen, falls Sie mit etwas anderes als UTF8.
InformationsquelleAutor Nikola Tulimirovic
wenn Sie möchten, eine mysql-Lösung, ich hatte ähnliche Probleme mit 2 meiner Projekte, die nach einer server-migration. Nach der Suche und versuchen, eine Menge von Lösungen, stieß ich auf mit diesem one /nichts, bevor diese gearbeitet):
Nach dem hinzufügen dieser Zeile in meiner config-Datei funktioniert alles einwandfrei!
Fand ich diese Lösung https://www.w3schools.com/PHP/func_mysqli_set_charset.asp, wenn ich war auf der Suche zu lösen, einfügen von html-Abfrage
Glück!
InformationsquelleAutor castro_pereira