Frage

Es kommt oft vor, dass Zeichen wie e umgewandelt wird zu à © , obwohl die Sortierung für die MySQL-DB, Tabelle und das Feld utf8_general_ci gesetzt. Die Codierung in dem Content-Type für die Seite auch auf UTF8 gesetzt ist.

Ich weiß, über utf8_encode / dekodieren, aber ich bin mir nicht ganz sicher, wo und wie es zu benutzen.

Ich habe die „ das absolute Minimum Jeder Software-Entwickler Absolut zu lesen, müssen positiv über Unicode wissen und Charakter Sets (Keine Entschuldigungen!) “-Artikel, aber ich brauche einige MySQL / PHP konkrete Hinweise.

Frage: Wie stelle ich sicher, dass die Benutzer eingegebenen Daten internationale Zeichen enthält, beschädigt nicht erhalten

War es hilfreich?

Lösung

Auf dem ersten Blick auf http://www.nicknettleton.com / zine / php / php-utf-8-Spickzettel ich denke, dass eine wichtige Sache (vielleicht übersehen ich dieses) fehlt. Abhängig von Ihrer MySQL-Installation und / oder Konfiguration haben Sie die Verbindungsverschlüsselung einzustellen, so dass MySQL weiß, was kodieren Sie auf der Client-Seite erwar (die Client-Seite der MySQL-Verbindung bedeutet, die Sie PHP-Skript sein sollen). Sie können dies tun, indem Sie manuell die Ausgabe a

SET NAMES utf8

Abfrage vor jeder anderen Abfrage, die Sie mit dem MySQL-Server zu senden.

ob Du PDO mit auf der PHP-Seite können Sie den Verbindungsaufbau automatisch diese Abfrage auf jeder (Re-) ausgeben verbinden, indem mit

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

, wenn die DB-Verbindung zu initialisieren.

Andere Tipps

Sortierungs und charset ist nicht dasselbe. Ihre Zusammenstellung muss die charset übereinstimmen, so dass, wenn Ihr charset utf-8, so sollte die Sortierung. obwohl die falsche Kollation Pflücken werden Ihre Daten nicht verstümmeln -. Nur String-Vergleich machen / Sortierarbeiten falsch

Das heißt, es gibt mehrere Orte, wo Sie charset Einstellungen in PHP einstellen. Ich würde empfehlen, dass Sie utf-8 im gesamten, wenn möglich. Orte, die charset angegeben werden muss, sind:

  • Die Datenbank. Dies kann auf Datenbank-, Tabellen- und Feldebene festgelegt werden, und sogar auf einer Pro-Abfrageebene.
  • Verbindung zwischen PHP und Datenbank.
  • HTTP-Ausgabe; Stellen Sie sicher, dass der HTTP-Header Content-Type gibt utf-8. Sie können Standardwerte in PHP und in Apache setzen, oder Sie können die Verwendung von PHP header Funktion.
  • HTTP-Eingang. Im Allgemeinen werden Formen in der gleichen charset submitteed werden, wie die Seite wurde serviert, aber um sicherzustellen, sollten Sie die accept-charset Eigenschaft. Vergewissern Sie sich außerdem, dass URLs sind utf-8 codiert, oder vermeiden, mit Nicht-ASCII-Zeichen in URLs (und GET-Parameter).

utf8_encode / Decodierfunktionen ein wenig sind seltsam benannt . Sie wandeln speziell zwischen latin1 (ISO-8859-1) und utf-8. Wenn alles in Ihrer Anwendung ist utf-8, werden Sie nicht sie haben viel zu verwenden.

Es gibt mindestens zwei gotchas in Bezug auf utf-8 und PHP. Die erste ist, dass PHP eingebaute String-Funktionen Strings Single-Byte zu erwarten. Für viele Operationen, spielt das keine Rolle, aber es bedeutet, als Sie nicht auf strlen und andere Funktionen. Es gibt eine gute heruntergekommenen der Einschränkungen bei dieser Seite . Normalerweise ist es kein großes Problem, vor allem aber bei der Verwendung von 3-Party-Bibliotheken, müssen Sie sich bewusst sein, dass die Dinge auf diese sprengen könnte. Eine Option ist auch die mb_string Erweiterung zu verwenden, die die Möglichkeit hat, alle störenden Funktionen mit utf-8 bewusst Alternativen zu ersetzen. Es ist immer noch keine 100% ige kugelsicher Lösung, aber es wird in den meisten Fällen funktionieren.

Ein weiteres Problem ist, dass einige Installationen von PHP haben immer noch den magic_quotes Einstellung eingeschaltet. Dieses Problem ist orthogonal zu utf-8, kann aber bis zu einem gewissen Kopf kratzen führen. Schalten Sie es aus, für die eigene geistige Gesundheit willen.

Nicht viel gesagt werden, dass in diesem Artikel nicht abgedeckt ist

http://developer.loftdigital.com/blog/php-utf -8-Spickzettel

Was Sie tun sollten:

  • Stellen Sie sicher, Apache löscht UTF-8-Inhalte. Tun Sie dies in Ihrer httpd.conf, oder verwenden Sie PHP header()-Funktion manuell zu tun.
  • Stellen Sie sicher, dass Ihre Datenbankverbindung UTF8 ist. SET NAMES utf8 funktioniert der Trick.
  • Stellen Sie sicher, dass alle Tabellen auf UTF8 festgelegt werden.
  • Stellen Sie sicher, dass alle Ihre PHP und Template-Dateien als UTF8 codiert sind, wenn Sie in ihnen internationale Zeichen speichern.

Sie haben in der Regel zu tun, nicht zu viel die mb_string oder utf8_encode/decode-Funktionen zu verwenden, wenn Sie dies tun.

Für eine bessere Unicode Korrektheit, sollten Sie utf8_unicode_ci verwenden (obwohl die Dokumentation ist ein wenig vage auf die Unterschiede). Sie sollten auch richtig sind die folgenden Mysql-Flags gesetzt stellen Sie sicher, -

  • default-character-set = utf8
  • überspringen-character-set-client-Handshake // wichtig, damit der Kunde selbst nicht zwingend eine andere Kodierung

Die kann durch Senden der entsprechenden Abfragen in der MySQL-Konfigurationsdatei (unter der [mysqld] Tab) oder zur Laufzeit festgelegt werden.

Unabhängig von der Sprache es geschrieben in, wenn Sie sind eine App zu erstellen, die eine breite Palette von Kodierungen ermöglicht, handhabt es in Stücken:

  • die Kodierung identifizieren
    • irgendwie wollen Sie herausfinden, welche Art der Codierung Sie es zu tun haben, sonst ist es ziemlich sinnlos ist es weiter zu prüfen. Sie werden mit Junk-Zeichen am Ende.
  • Behandeln Sie Ihren Bytes
    • denkt dieser Strings weniger wie ‚Strings‘ von Charakteren, und mehr wie Listen von Bytes
    • PHP ist besonders hinterhältig. Lassen Sie es nicht Ihre Daten on-the-fly gestutzt. Wenn Sie einen UTF-8-String sind regexing, stellen Sie sicher, dass Sie es als solches
    • identifizieren
  • Store für das LCD
    • Auch Sie wollen nicht, Daten zu kürzen. Wenn Sie einen Satz in Englisch sind speichern, können Sie speichern auch eine Reihe von Mandarin glyphps? Wie wäre es Arabisch? Welche davon wird den meisten Platz benötigen? Konto für sie.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top