1355 Stimmen

UTF-8 durchgängig

Ich bin dabei, einen neuen Server einzurichten und möchte UTF-8 in meiner Webanwendung vollständig unterstützen. Ich habe dies in der Vergangenheit auf bestehenden Servern ausprobiert und muss am Ende immer auf ISO-8859-1 zurückgreifen.

Wo genau muss ich die Kodierung/Chartersets einstellen? Ich bin mir bewusst, dass ich Apache, MySQL und PHP konfigurieren muss, um dies zu tun - gibt es eine Standard-Checkliste, die ich befolgen kann, oder vielleicht eine Fehlerdiagnose, wo die Unstimmigkeiten auftreten?

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

22 Stimmen

Hier ist eine Einführung in Kodierungen im Allgemeinen und Kodierungen in PHP im Besonderen: Was jeder Programmierer unbedingt über Kodierungen und Zeichensätze für die Arbeit mit Text wissen muss

0 Stimmen

Einige aktuelle Diskussionen über PHP 7 deuten darauf hin, dass es keine Änderungen an der "offiziell aufgegebenen" Position von 2010 gibt... Es gibt etwas mehr über "PHP7 und UTF-8"?

0 Stimmen

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

27voto

Jimmy Kane Punkte 15004

Zunächst einmal, wenn Sie in PHP vor 5.3 sind, dann nicht. Sie haben eine Tonne von Problemen zu bewältigen.

Ich bin überrascht, dass noch niemand die intl Bibliothek, diejenige, die eine gute Unterstützung für Unicode , Grapheme , String-Operationen , Lokalisierung und viele mehr, siehe unten.

Ich werde einige Informationen über die Unicode-Unterstützung in PHP zitieren von Elizabeth Smiths Folien en PHPBenelux'14

INTL

Gut:

  • Wrapper um ICU-Bibliothek
  • Standardisierte Locales, Locale pro Skript einstellen
  • Zahlenformatierung
  • Formatierung der Währung
  • Nachrichtenformatierung (ersetzt gettext)
  • Kalender, Datum, Zeitzone und Uhrzeit
  • Transliterator
  • Spoofchecker
  • Ressourcenbündel
  • Konverter
  • IDN-Unterstützung
  • Grapheme
  • Zusammenstellung
  • Iteratoren

Schlecht:

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

mb_string

  • Aktiviert zend_multibyte Unterstützung
  • Unterstützt transparente HTTP-In/Out-Kodierung
  • Bietet einige Wrapper für Funktionen wie strtoupper

ICONV

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

DATENBANKEN

  • MySQL: Zeichensatz und Sortierung bei Tabellen und bei der Verbindung (nicht bei der Sortierung). Verwenden Sie außerdem 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 Probleme

  • Sie können keine Unicode-Dateinamen mit PHP und Windows verwenden, es sei denn, Sie verwenden eine Erweiterung des dritten Teils.
  • Senden Sie alles in ASCII, wenn Sie exec, proc_open und andere Kommandozeilenaufrufe verwenden
  • Einfacher Text ist kein einfacher Text, Dateien haben Kodierungen
  • Mit dem iconv-Filter können Sie Dateien im laufenden Betrieb konvertieren

2 Stimmen

Ja, richtig. Mysqli und PDO können ihre eigenen Treiber verwenden. Sie können auch den mysqlnd-Treiber verwenden, wenn Sie php kompilieren mit --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd Optionen.

20voto

Puerto AGP Punkte 303

Das Einzige, was ich zu diesen erstaunlichen Antworten hinzufügen würde, ist, dass Sie Ihre Dateien in UTF-8-Kodierung speichern sollten. Ich habe festgestellt, dass die Browser diese Eigenschaft eher akzeptieren als die Einstellung UTF-8 als Code-Kodierung. Jeder anständige Texteditor zeigt Ihnen dies an. Zum Beispiel, Notepad++ verfügt über eine Menüoption für die Dateikodierung, die Ihnen die aktuelle Kodierung anzeigt und es Ihnen ermöglicht, diese zu ändern. Für alle meine PHP-Dateien verwende ich UTF-8 ohne STÜCKLISTE .

Vor einiger Zeit hat mich jemand gebeten, UTF-8-Unterstützung für eine PHP- und MySQL-Anwendung hinzuzufügen, die von jemand anderem entwickelt wurde. Ich stellte fest, dass alle Dateien in ANSI kodiert waren, also musste ich ikonv um alle Dateien zu konvertieren, die Datenbanktabellen auf den Zeichensatz UTF-8 umzustellen und utf8_allgemein_ci collate, fügen Sie 'SET NAMES utf8' zur Datenbankabstraktionsschicht nach der Verbindung hinzu (wenn Sie 5.3.6 oder früher verwenden). Andernfalls müssen Sie charset=utf8 in der Verbindungszeichenfolge verwenden) und ändern Sie die String-Funktionen so, dass sie die entsprechenden PHP-Multibyte-String-Funktionen verwenden.

18voto

Miguel Stevens Punkte 7419

Ich habe kürzlich entdeckt, dass die Verwendung von strtolower() kann zu Problemen führen, wenn die Daten nach einem Sonderzeichen abgeschnitten werden.

Die Lösung war die Verwendung von

mb_strtolower($string, 'UTF-8');

mb_ verwendet MultiByte. Es unterstützt mehr Zeichen, ist aber im Allgemeinen etwas langsamer.

13voto

JW. Punkte 48942

In PHP müssen Sie entweder die Funktion Multibyte-Funktionen , oder schalten Sie mbstring.func_overload . Auf diese Weise werden Dinge wie strlen funktionieren, wenn Sie Zeichen haben, die mehr als ein Byte benötigen.

Sie müssen auch den Zeichensatz Ihrer Antworten festlegen. Sie können entweder AddDefaultCharset verwenden, wie oben beschrieben, oder PHP-Code schreiben, der die Kopfzeile zurückgibt. (Oder Sie fügen ein META-Tag zu Ihren HTML-Dokumenten hinzu.)

0 Stimmen

Toller Tipp mit der func_overload-Einstellung - ermöglicht minimale Änderungen am bestehenden Code.

5 Stimmen

Seien Sie nur vorsichtig - mancher Code könnte sich tatsächlich auf die Ein-Byte-pro-Zeichen-Natur der Standard-String-Funktionen verlassen.

0 Stimmen

Es ist wichtig zu beachten, dass die Funktion mbstring.func_overload ab PHP 7.2 aufgrund der im obigen Kommentar von @JW genannten Probleme veraltet ist. Der beste Rat ist also: Ja, Sie sollten auf jeden Fall die mbstring-Funktionen verwenden, aber verwenden Sie nicht die Überladungsfunktion, um die Standardfunktionen als Multibyte zu verwenden.

12voto

Abdul Sadik Yalcin Punkte 1595

Ich habe gerade das gleiche Problem durchgemacht und eine gute Lösung in den PHP-Handbüchern gefunden.

Ich habe die Kodierung aller meiner Dateien auf UTF8 und dann auf die Standardkodierung meiner Verbindung geändert. Damit waren alle Probleme gelöst.

if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
   printf("Current character set: %s\n", $mysqli->character_set_name());
}

Quelle anzeigen

2 Stimmen

Ich habe eine Stunde damit verbracht, ein Kodierungsproblem auf einer Seite zu lösen, an der ich gerade arbeite, und normalerweise bin ich ziemlich gut darin, Dinge herauszufinden. Ich konsultiere immer diese Seite und deine Antwort hat mir sehr geholfen. Ich habe mein Upvote bekommen. In meinem Fall, set_charset('utf8mb4') funktionierte nicht, aber >set_charset("utf8") und das wurde in den anderen Antworten nicht wirklich gezeigt.

0 Stimmen

@FunkFortyNiner Vorsicht: set_charset("utf8") kann funktionieren, verhält sich aber anders (siehe die Anmerkungen zum Unterschied zwischen utf8 et utf8mb4 und die mysql-Versionsgeschichte). verwenden utf8 wenn es sein muss UND NUR wenn du weißt, was du tust !

0 Stimmen

5 Sterne Lösung, ich habe eine Textdatei Zeile für Zeile gelesen und für jedes Zeichen ein ? erhalten, dann habe ich save-as , statt ansi, utf8 verwendet. danke.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X