UTF-8 durchgängig

Lesezeit: 9 Minuten

UTF 8 durchgangig
Merkur

Ich richte einen neuen Server ein und möchte UTF-8 in meiner Webanwendung vollständig unterstützen. Ich habe dies in der Vergangenheit auf bestehenden Servern versucht und scheine immer wieder auf ISO-8859-1 zurückgreifen zu müssen.

Wo genau muss ich die Kodierung/Zeichensätze einstellen? Mir ist bewusst, dass ich Apache, MySQL und PHP konfigurieren muss, um dies zu tun – gibt es eine Standard-Checkliste, der ich folgen kann, oder vielleicht eine Fehlerbehebung, wo die Diskrepanzen auftreten?

Dies ist für einen neuen Linux-Server, auf dem MySQL 5, PHP, 5 und Apache 2 ausgeführt werden.

  • Hier ist eine Einführung in Kodierungen im Allgemeinen und Kodierungen in PHP im Besonderen: Was jeder Programmierer unbedingt über Kodierungen und Zeichensätze wissen muss, um mit Text zu arbeiten

    – verzeihen

    9. Juli 2013 um 19:33 Uhr

  • Einige neuere Diskussionen über PHP 7 zeigen an, dass es keine Änderungen an der “offiziell aufgegebenen” Position von 2010 gibt … Gibt es etwas mehr über “PHP7 und UTF-8”?

    – Peter Krauß

    23. September 2015 um 6:02 Uhr

  • Dieses Problem ist weit verbreitet. Aber es gibt keine Shortcut-Lösung, Sie müssen sie einrichten utf-8 für jeden von ihnen separat – MySQL 5, PHP 5 ODER Apache 2.

    – Manish Shrivastava

    18. Januar 2017 um 14:00 Uhr

UTF 8 durchgangig
chazomaticus

Datenspeicher:

  • Präzisiere das utf8mb4 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 implizit verwendet utf8mb4 Kodierung, wenn a utf8mb4_* Sortierung ist angegeben (ohne expliziten Zeichensatz).

  • In älteren MySQL-Versionen (< 5.5.3) werden Sie leider gezwungen sein, einfach zu verwenden utf8, 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 verwendeten DB-Zugriffsmethode den Zeichensatz für die Verbindung festlegen utf8mb4. 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. Bei PHP:

    • Wenn Sie die verwenden PDO Abstraktionsschicht mit PHP ≥ 5.3.6 können Sie angeben charset in dem DSN:

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Wenn Sie verwenden mysqlDu kannst anrufen set_charset():

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Wenn Sie mit Plain stecken bleiben MySQL aber zufällig läuft PHP ≥ 5.2.3, können Sie anrufen mysql_set_charset.

  • 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 erwartet, dass Daten auf der Verbindung codiert werden: SET NAMES 'utf8mb4'.

  • Die gleiche Überlegung bzgl utf8mb4/utf8 gilt wie oben.

Ausgabe:

  • UTF-8 sollte im HTTP-Header gesetzt werden, wie z Content-Type: text/html; charset=utf-8. Sie können dies entweder durch die Einstellung erreichen default_charset in php.ini (bevorzugt) oder manuell mit header() Funktion.
  • 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).
  • Beim Codieren der Ausgabe mit json_encode()addieren JSON_UNESCAPED_UNICODE als zweiter Parameter.

Eingang:

  • 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 Anforderungscodierung haben (falls sie manipuliert werden könnte), können Sie jede empfangene Zeichenfolge als 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.

Andere Codeüberlegungen:

  • 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. Sie werden wahrscheinlich ausgiebig Gebrauch von PHP machen wollen mbstring Verlängerung.

  • 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 verwenden mbstring 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 an utf8.com für einige gute Ressourcen, um alles zu lernen, was Sie wissen müssen.

  • Ich liege nicht falsch: COLLATE impliziert CHARACTER SET. Siehe zB dev.mysql.com/doc/refman/5.0/en/charset-database.html.

    – chazomaticus

    10. November 2008 um 23:01 Uhr

  • Beachten Sie, dass MySQL nicht dieselbe Sprache wie alle anderen spricht. Wenn MySQL “utf8” sagt, bedeutet das wirklich “irgendeine seltsam verzögerte Variante von UTF-8, die aus Gott weiß welchem ​​lächerlichen Grund auf drei Bytes begrenzt ist”. Wenn Sie wirklich UTF-8 wollen, sollten Sie MySQL sagen, dass Sie dieses seltsame Ding wollen, das MySQL gerne aufruft utf8mb4. Sparen Sie nicht an den “WTF!”s.

    – R.Martinho Fernandes

    9. April 2013 um 9:21 Uhr


1647109452 985 UTF 8 durchgangig
Merkator

Ich möchte der hervorragenden Antwort von Chazomaticus eine Sache hinzufügen:

Vergiss auch nicht das META-Tag (so, 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 in allen anderen Browsern einwandfrei, aber der Internet Explorer bestand immer noch darauf, die “westeuropäische” Codierung 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 eigentlich eine ziemlich große Abschnitt gewidmet I18N. Sie haben eine Reihe von Artikeln zu diesem Thema, die die HTTP-, (X)HTML- und CSS-Seite der Dinge beschreiben:

Sie empfehlen die Verwendung sowohl des HTTP-Headers als auch des HTML-Meta-Tags (oder der XML-Deklaration, falls XHTML als XML bereitgestellt wird).

UTF 8 durchgangig
Chroder

Neben Einstellung default_charset in der php.ini können Sie den korrekten Zeichensatz mit senden header() 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 Zeichenfolgenfunktionen funktionieren nicht mit Unicode, und einige können Zeichenfolgen vollständig verstümmeln. PHP betrachtet “Zeichen” als 1 Byte lang. Manchmal ist das in Ordnung (z. explode() sucht nur nach einer Bytefolge und verwendet sie als Trennzeichen – es spielt also keine Rolle, nach welchen tatsächlichen Zeichen Sie suchen). Aber zu anderen Zeiten, wenn die Funktion tatsächlich darauf ausgelegt ist, zu funktionieren ZeichenPHP 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 mbstring-Erweiterung, die versuchen, dies auch für Sie zu 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 mbstring trotzdem hinter den Kulissen verwenden, um die Leistung zu steigern.

1647109453 560 UTF 8 durchgangig
Jim

Warnung: Diese Antwort gilt für PHP 5.3.5 und niedriger. Verwenden Sie es nicht für PHP Version 5.3.6 (veröffentlicht im März 2011) oder höher.

Vergleiche mit Palecs Antwort auf PDO + MySQL und defekte UTF-8-Kodierung.


Ich habe ein Problem mit jemandem gefunden, der PDO verwendet, und die Antwort war, dies für die PDO-Verbindungszeichenfolge zu verwenden:

$pdo = new PDO(
    'mysql:host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

Die Seite, von der ich das genommen habe, ist ausgefallen, aber ich konnte es glücklicherweise über den Google-Cache abrufen.

In meinem Fall habe ich verwendet mb_split, die Regex verwendet. Daher musste ich auch manuell sicherstellen, dass die Regex-Codierung utf-8 war mb_regex_encoding('UTF-8');

Als Randnotiz habe ich auch durch Laufen entdeckt mb_internal_encoding() dass die interne Codierung nicht utf-8 war, und ich habe das durch Ausführen geändert mb_internal_encoding("UTF-8");.

1647109453 316 UTF 8 durchgangig
Peter Mortensen

Zunächst einmal, wenn Sie in PHP vor 5.3 sind, dann nein. Du hast eine Menge Probleme zu bewältigen.

Ich bin überrascht, dass niemand das erwähnt hat intl Bibliothek, die eine gute Unterstützung für hat Unicode, Grapheme, Zeichenfolgenoperationen, Lokalisierung und viele mehr, siehe unten.

Ich werde einige Informationen über Unicode-Unterstützung in PHP von zitieren Elizabeth Smiths Folien bei PHPBenelux’14

INTL

Gut:

  • Wrapper um die ICU-Bibliothek
  • Standardisierte Gebietsschemas, Gebietsschema per Skript festlegen
  • Zahlenformatierung
  • Währungsformatierung
  • Nachrichtenformatierung (ersetzt gettext)
  • Kalender, Daten, Zeitzone und Uhrzeit
  • Transliterator
  • Spoofchecker
  • Ressourcenpakete
  • Konverter
  • IDN-Unterstützung
  • Grapheme
  • Kollation
  • Iteratoren

Schlecht:

  • Unterstützt zend_multibyte nicht
  • Unterstützt keine HTTP-Input-Output-Konvertierung
  • Unterstützt keine Funktionsüberlastung

mb_string

  • Aktiviert die Unterstützung von zend_multibyte
  • Unterstützt transparente HTTP-In/Out-Codierung
  • Stellt einige Wrapper für Funktionen wie strtoupper bereit

ICONV

  • Primär für die Zeichensatzkonvertierung
  • Ausgabepuffer-Handler
  • Mime-Encoding-Funktionalität
  • Wandlung
  • einige String-Helfer (len, substr, strpos, strrpos)
  • Stream-Filter stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')

DATENBANKEN

  • MySQL: Zeichensatz und Sortierung auf Tabellen und auf der Verbindung (nicht die Sortierung). Verwenden Sie auch nicht mysql – mysqli oder PDO
  • postgresql: pg_set_client_encoding
  • sqlite(3): Stellen Sie sicher, dass es mit Unicode- und Intl-Unterstützung kompiliert wurde

Einige andere Fallstricke

  • Sie können keine Unicode-Dateinamen mit PHP und Windows verwenden, es sei denn, Sie verwenden eine Erweiterung eines Drittanbieters.
  • Senden Sie alles in ASCII, wenn Sie exec, proc_open und andere Befehlszeilenaufrufe verwenden
  • Klartext ist nicht Klartext, Dateien haben Kodierungen
  • Mit dem iconv-Filter können Sie Dateien im Handumdrehen konvertieren

1647109454 978 UTF 8 durchgangig
Funk Forty-Niner

Das einzige, was ich diesen erstaunlichen Antworten hinzufügen möchte, ist, das Speichern Ihrer Dateien in utf8-Codierung zu betonen. Ich habe festgestellt, dass Browser diese Eigenschaft akzeptieren, anstatt utf8 als Ihre Codecodierung festzulegen. Jeder anständige Texteditor zeigt Ihnen dies an, zum Beispiel hat Notepad ++ eine Menüoption für die Dateicodierung, die Ihnen die aktuelle Codierung zeigt und Ihnen ermöglicht, sie zu ändern. Für alle meine PHP-Dateien verwende ich utf8 ohne BOM.

Vor einiger Zeit bat mich jemand, utf8-Unterstützung für eine von jemand anderem entworfene PHP/Mysql-Anwendung hinzuzufügen. Ich bemerkte, dass alle Dateien in ANSI codiert waren, also musste ich ICONV verwenden, um alle Dateien zu konvertieren, die Datenbanktabellen zu ändern, um die zu verwenden utf8 charset und utf8_general_ci sortieren, fügen Sie nach der Verbindung „SET NAMES utf8“ zur Datenbankabstraktionsschicht hinzu (wenn Sie 5.3.6 oder früher verwenden, müssen Sie ansonsten charset=utf8 in der Verbindungszeichenfolge verwenden) und ändern Sie die Zeichenfolgenfunktionen, um das PHP-Multibyte zu verwenden String-Funktionen äquivalent.

994820cookie-checkUTF-8 durchgängig

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy