GNU/Linux >> LINUX-Kenntnisse >  >> Linux

UTF-8 durchgängig

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 implizit utf8mb4 verwendet Codierung, wenn ein utf8mb4_* 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 von default_charset in php.ini (bevorzugt) oder manuell mit header() 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 Sie JSON_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).


Linux
  1. Was ist der beste distro-/shellunabhängige Weg, um Umgebungsvariablen festzulegen?

  2. Alle Dateien bis zum Match anzeigen?

  3. Beste Möglichkeit, alle Slurm-Jobs von der Shell-Befehlsausgabe abzubrechen?

  4. So übergeben Sie ein Argument in Expect über die Befehlszeile in einem Shell-Skript

  5. Linux - Gibt es eine Möglichkeit, die Geschwindigkeit Ihres Speichers per Software zu ermitteln?

So richten Sie WordPress auf einem Raspberry Pi ein

So richten Sie den Pretty Hostnamen ein

Wie stelle ich den Cron-Job so ein, dass er ein PHP-Skript in cPanel ausführt?

Wie stelle ich eine PHP-Version über .htaccess in cPanel ein?

So richten Sie die UFW-Firewall unter Linux ein

Postman Ubuntu 18.04 installieren:Der einfachste Weg!