UTF-8 bis zum Ende


1191

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 vorhandenen Servern versucht und muss immer wieder auf ISO-8859-1 zurückgreifen.

Wo genau muss ich die Codierung / Zeichensätze einstellen? Ich bin mir bewusst, dass ich Apache, MySQL und PHP konfigurieren muss, um dies zu tun. Gibt es eine Standard-Checkliste, der ich folgen kann, oder kann ich möglicherweise Fehler beheben, wenn die Nichtübereinstimmungen auftreten?

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


8
Hier ist eine Übersicht über alle Codierungsfehler, die Sie möglicherweise machen können: sebastianviereck.de/de/…
Sebastian Viereck

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

Einige aktuelle Diskussionen über PHP 7 zeigen, dass es keine Änderungen in der "offiziell aufgegebenen" Position von 2010 gibt ... Gibt es etwas mehr über "PHP7 und UTF-8"?
Peter Krauss

Dieses Problem ist häufig. Es gibt jedoch keine Verknüpfungslösung. Sie müssen sie utf-8für jede einzelne separat einrichten - MySQL 5, PHP 5 ODER Apache 2.
Manish Shrivastava

Antworten:


1015

Datenspeicherung :

  • Geben Sie den utf8mb4Zeichensatz für alle Tabellen und Textspalten in Ihrer Datenbank an. Dadurch kann MySQL in UTF-8 nativ codierte Werte physisch speichern und abrufen. Beachten Sie, dass MySQL implizit die utf8mb4Codierung verwendet , wenn eine utf8mb4_*Sortierung angegeben wird (ohne expliziten Zeichensatz).

  • In älteren Versionen von MySQL (<5.5.3) müssen Sie leider einfach verwenden utf8, was 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 Verbindungszeichensatz auf festlegen utf8mb4. Auf diese Weise führt MySQL keine Konvertierung von seinem nativen UTF-8 durch, wenn Daten an Ihre Anwendung übergeben werden und umgekehrt.

  • Einige Treiber bieten einen eigenen Mechanismus zum Konfigurieren des Verbindungszeichensatzes, der sowohl seinen eigenen internen Status aktualisiert als auch MySQL über die für die Verbindung zu verwendende Codierung informiert. Dies ist normalerweise der bevorzugte Ansatz. In PHP:

    • Wenn Sie die PDO- Abstraktionsschicht mit PHP ≥ 5.3.6 verwenden, können Sie charsetim DSN Folgendes angeben :

      $dbh = new PDO('mysql:charset=utf8mb4');
    • Wenn Sie mysqli verwenden , können Sie anrufen set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
      mysqli_set_charset($link, 'utf8mb4');  // procedural style
    • Wenn Sie mit einfachem MySQL nicht weiterkommen, aber zufällig PHP ≥ 5.2.3 ausführen , 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 ausgeben, um MySQL mitzuteilen, wie Ihre Anwendung erwartet, dass Daten über die Verbindung codiert werden : SET NAMES 'utf8mb4'.

  • Die gleiche Überlegung bezüglich utf8mb4/ utf8gilt wie oben.

Ausgabe :

  • Wenn Ihre Anwendung Text an andere Systeme überträgt, müssen diese auch über die Zeichenkodierung informiert werden. Bei Webanwendungen muss der Browser über die Codierung informiert werden, in der Daten gesendet werden (über HTTP-Antwortheader oder HTML-Metadaten ).

  • In PHP können Sie die default_charsetOption php.ini verwenden oder den Content-TypeMIME-Header manuell selbst ausgeben. Dies ist nur mehr Arbeit, hat aber den gleichen Effekt.

  • Wenn das Ausgangssignal unter Verwendung Codieren json_encode(), fügt JSON_UNESCAPED_UNICODEals zweiten Parameter.

Eingabe :

  • Leider sollten Sie überprüfen, ob jede empfangene Zeichenfolge als UTF-8 gültig ist, bevor Sie versuchen, sie zu speichern oder irgendwo zu verwenden. PHPs machen mb_check_encoding()den Trick, aber Sie müssen es religiös verwenden. Daran führt kein Weg vorbei, da böswillige Clients Daten in jeder gewünschten Codierung senden können und ich keinen Trick gefunden habe, um PHP dazu zu bringen, dies zuverlässig für Sie zu tun.

  • Nach dem Lesen der aktuellen HTML-Spezifikation sind die folgenden Unteraufzählungszeichen für modernes HTML nicht mehr erforderlich oder sogar gültig. Nach meinem Verständnis arbeiten Browser mit Daten in dem für das Dokument angegebenen Zeichensatz und senden diese. Wenn Sie jedoch auf ältere HTML-Versionen (XHTML, HTML4 usw.) abzielen, können diese Punkte dennoch nützlich sein:

    • Nur für HTML vor HTML5 : Sie möchten, dass alle von Browsern an Sie gesendeten Daten in UTF-8 vorliegen. Wenn Sie dies nur zuverlässig tun, fügen Sie das accept-charsetAttribut leider allen Ihren <form>Tags hinzu : <form ... accept-charset="UTF-8">.
    • Nur für HTML vor HTML5 : Beachten Sie, dass die W3C-HTML-Spezifikation besagt, dass Clients standardmäßig Formulare mit dem vom Server bereitgestellten Zeichensatz an den Server zurücksenden sollten. Dies ist jedoch anscheinend nur eine Empfehlung, weshalb bei jedem einzelnen explizit angegeben werden muss <form>Etikett.

Weitere Überlegungen zum Code :

  • Natürlich sollten alle Dateien, die Sie bereitstellen (PHP, HTML, JavaScript usw.), in gültigem UTF-8 codiert sein.

  • Sie müssen sicherstellen, dass Sie dies jedes Mal sicher tun, wenn Sie eine UTF-8-Zeichenfolge verarbeiten. Dies ist leider der schwierige Teil. Sie werden wahrscheinlich die PHP- mbstringErweiterung in großem Umfang nutzen wollen .

  • PHP integrierte String - Operationen sind nicht standardmäßig UTF-8 sicher. Es gibt einige Dinge, die Sie mit normalen PHP-Zeichenfolgenoperationen sicher tun können (z. B. Verkettung), aber für die meisten Dinge sollten Sie die entsprechende mbstringFunktion verwenden.

  • Um zu wissen, was Sie tun (lesen Sie: nicht durcheinander bringen), müssen Sie UTF-8 wirklich kennen und wissen, wie es auf der niedrigstmöglichen Ebene funktioniert. Unter den Links von utf8.com finden Sie einige gute Ressourcen, um alles zu erfahren, was Sie wissen müssen.


4
Nach meinem Verständnis wird die Sortierung, wenn Sie sie als utf8_ * angeben, automatisch auch als utf8 codiert. Ist das falsch?
Chazomaticus

49
Ich liege nicht falsch: COLLATE impliziert CHARACTER SET. Siehe z . B. dev.mysql.com/doc/refman/5.0/en/charset-database.html .
Chazomaticus

7
Erwägen Sie das Hinzufügen von PDO-Beispielen zum Festlegen des Zeichensatzes.
Ja͢ck

97
Beachten Sie, dass MySQL nicht dieselbe Sprache spricht wie alle anderen. Wenn MySQL "utf8" sagt, bedeutet das wirklich "eine seltsam verzögerte Variante von UTF-8, die aus göttlichen Gründen auf drei Bytes begrenzt ist". Wenn Sie wirklich UTF-8 wollen, sollten Sie MySQL sagen, dass Sie diese seltsame Sache wollen, die MySQL gerne utf8mb4 aufruft . Sparen Sie nicht bei den "WTF!".
R. Martinho Fernandes

4
Diese Antwort hat mir sehr geholfen, ABER ich habe auch festgestellt, dass ich in meinem Fall JSON_UNESCAPED_UNICODE zu meinem PHP json_encode hinzufügen musste, wenn ich die DB-Abfrageergebnisse über Ajax zurückgab.
Petay87

150

Ich möchte der hervorragenden Antwort von chazomaticus eines 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 schon früher Probleme damit bereitet.

Ich habe alles richtig gemacht; Die Datenbank, die Datenbankverbindung und der HTTP-Header vom Inhaltstyp waren alle auf UTF-8 festgelegt und funktionierten in allen anderen Browsern einwandfrei. Internet Explorer bestand jedoch weiterhin auf der Verwendung der "westeuropäischen" Codierung.

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 dem I18N gewidmet ist . Sie haben eine Reihe von Artikeln zu diesem Thema - sie beschreiben die HTTP-, (X) HTML- und CSS-Seite der Dinge:

Sie empfehlen, sowohl den HTTP-Header als auch das HTML-Meta-Tag (oder die XML-Deklaration bei XHTML als XML) zu verwenden.


Sollte es nicht auch möglich sein, den Zeichensatz in den HTTP-Headern anzugeben?
Benötigt

2
@oliver: Ja, Sie können es im HTTP-Header senden, aber es ist besser, es im Inhalt zu senden, denn wenn der Client die Datei speichert, wird immer das Meta-Tag gespeichert. Ein HTTP-Header verschwindet wahrscheinlich nur, wenn der Browser intelligent genug ist, um ihn in ein Meta-Tag in der gespeicherten Datei zu kopieren.

5
Stellen Sie außerdem sicher, dass die Zeile das erste untergeordnete Element des Kopfelements ist (vor allen Unicode-Elementen). Der Browser kann die Seite neu interpretieren, nachdem er das oben beschriebene Metaelement getroffen hat.
alex

64

Zusätzlich zur Einstellung default_charsetin php.ini können Sie header()vor jeder Ausgabe den richtigen Zeichensatz aus Ihrem Code senden :

header('Content-Type: text/html; charset=utf-8');

Die Arbeit mit Unicode in PHP ist einfach, solange Sie feststellen, dass die meisten Zeichenfolgenfunktionen nicht mit Unicode funktionieren und einige Zeichenfolgen möglicherweise vollständig entstellen . PHP betrachtet "Zeichen" als 1 Byte lang. Manchmal ist dies in Ordnung ( explode()sucht beispielsweise nur nach einer Byte-Sequenz und verwendet sie als Trennzeichen - es spielt also keine Rolle, nach welchen tatsächlichen Zeichen Sie suchen). In anderen Fällen, in denen die Funktion tatsächlich für die Arbeit mit Zeichen ausgelegt ist , hat PHP keine Ahnung, dass Ihr Text Mehrbyte-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 an UTF8-Zeichenfolgen arbeiten können. Es gibt Erweiterungen wie die mbstring-Erweiterung, die dies auch für Sie versuchen, aber ich bevorzuge die Verwendung der Bibliothek, weil sie portabler ist (aber ich schreibe Massenmarktprodukte, das ist also wichtig für mich). Phputf8 kann jedoch mbstring hinter den Kulissen verwenden, um die Leistung zu steigern.


Stellen Sie die Überlastungseinstellung in der php.ini ein. Dies ist hilfreich, wenn Sie Mehrbyte-Zeichenfolgen verwenden.
Anthony Rutledge

32

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 nicht verfügbar, aber ich konnte es zum Glück über den Google-Cache abrufen.


1
Wenn Sie etwas weiter suchen, ist dies nur für PHP-Versionen vor 5.3.6 erforderlich. Siehe auch: http://stackoverflow.com/a/4361485/2286722 (obwohl sie eine separate verwenden $dbh->exec("set names utf8");; ich bevorzuge die hier vorgestellte Methode). Übrigens. Es gibt auch einen ähnlichen Hinweis dazu als Kommentar im PHP-Handbuch: php.net/manual/en/pdo.construct.php#96325 .
Marten Koetsier


24

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

Als Randnotiz habe ich auch beim Ausführen festgestellt, mb_internal_encoding()dass die interne Codierung nicht utf-8 ist, und ich habe dies durch Ausführen geändert mb_internal_encoding("UTF-8");.


22

Zuallererst, wenn Sie in <5.3PHP sind, dann nein. Sie haben eine Menge Probleme zu lösen.

Ich bin überrascht, dass niemand die intl- Bibliothek erwähnt hat, die Unicode , Grapheme , String-Operationen , Lokalisierung und vieles mehr gut unterstützt (siehe unten).

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

INTL

Gut:

  • Wrapper um die Intensivbibliothek
  • Standardisierte Gebietsschemas, Gebietsschema pro Skript festlegen
  • Zahlenformatierung
  • Währungsformatierung
  • Nachrichtenformatierung (ersetzt gettext)
  • Kalender, Daten, Zeitzone und Zeit
  • Übersetzer
  • Spoofchecker
  • Ressourcenpakete
  • Konverter
  • IDN-Unterstützung
  • Grapheme
  • Kollation
  • Iteratoren

Schlecht:

  • Unterstützt zend_multibite nicht
  • Unterstützt keine HTTP-Eingabe-Ausgabe-Konvertierung
  • Unterstützt keine Funktionsüberladung

mb_string

  • Aktiviert die Unterstützung von zend_multibyte
  • Unterstützt transparente HTTP-In / Out-Codierung
  • Bietet einige Wrapper für Funktionalität wie Strtoupper

ICONV

  • Primär für die Zeichensatzkonvertierung
  • Ausgabepuffer-Handler
  • MIME-Codierungsfunktionalität
  • Umwandlung
  • 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 bei Verbindung (nicht die Kollatierung). Verwenden Sie auch nicht mysql - msqli 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 des 3. Teils.
  • Senden Sie alles in ASCII, wenn Sie exec, proc_open und andere Befehlszeilenaufrufe verwenden
  • Nur-Text ist kein einfacher Text, Dateien haben Codierungen
  • Mit dem iconv-Filter können Sie Dateien im laufenden Betrieb konvertieren

Ich werde diese Antwort aktualisieren, falls sich die hinzugefügten Funktionen ändern und so weiter.


2
Ja richtig. Mysqli und PDO können ihre nativen Treiber verwenden. Sie können auch den mysqlnd-Treiber verwenden, wenn Sie PHP mit --with-mysqli=mysqlnd --with-pdo-mysql=mysqlndOptionen kompilieren .
Alexander Yancharuk

14

Das einzige, was ich zu diesen erstaunlichen Antworten hinzufügen möchte, ist das Hervorheben des Speicherns Ihrer Dateien in der utf8-Codierung. Ich habe festgestellt, dass Browser diese Eigenschaft akzeptieren, indem sie utf8 als Ihre Codecodierung festlegen. Jeder anständige Texteditor zeigt Ihnen dies an. Beispielsweise verfügt Notepad ++ über eine Menüoption für die Dateieingabe. Sie zeigt Ihnen die aktuelle Codierung an und ermöglicht Ihnen, diese zu ändern. Für alle meine PHP-Dateien verwende ich utf8 ohne Stückliste.

Vor einiger Zeit hatte ich jemanden gebeten, utf8-Unterstützung für eine von jemand anderem entwickelte PHP / MySQL-Anwendung hinzuzufügen. Ich bemerkte, dass alle Dateien in ANSI codiert waren, also musste ich ICONV verwenden, um alle Dateien zu konvertieren, und die Datenbanktabellen ä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 charset = utf8 in der Verbindungszeichenfolge verwenden) und ändern Sie die Zeichenfolgenfunktionen, um das PHP-Multibyte zu verwenden String-Funktionen äquivalent.


13

Ich habe kürzlich festgestellt, dass die Verwendung strtolower()Probleme verursachen kann, bei denen die Daten nach einem Sonderzeichen abgeschnitten werden.

Die Lösung war zu verwenden

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

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


9

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

Ich habe meine gesamte Dateicodierung in UTF8 geändert und dann die Standardcodierung für meine Verbindung. Dies löste alle Probleme.

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());
}

Quelltext anzeigen


2
Ich habe eine Stunde lang versucht, ein Codierungsproblem auf einer Seite herauszufinden, an der ich arbeite, und ich bin normalerweise ziemlich gut darin, Dinge herauszufinden. Ich konsultiere immer diese Seite und Ihre Antwort hat mir sehr geholfen. Habe meine Gegenstimme bekommen. In meinem Fall hat set_charset('utf8mb4')es nicht funktioniert, aber es hat >set_charset("utf8")funktioniert und das wurde in den anderen Antworten nicht gezeigt.
Funk Forty Niner

@FunkFortyNiner Achtung: Funktioniert set_charset("utf8")möglicherweise, verhält sich jedoch anders (siehe die Anmerkungen zum Unterschied zwischen utf8und utf8mb4und dem MySQL-Versionsverlauf). Verwenden utf8 Sie, wenn Sie müssen und nur, wenn Sie wissen, was Sie tun !
Martin Hennings

5-Sterne-Lösung, ich habe eine Textdatei Zeile für Zeile gelesen und bekommen? Für jedes Zeichen habe ich dann gespart, da anstelle von ansi utf8 verwendet wurde. Vielen Dank.
Atef Farouk

8

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

Sie müssen auch den Zeichensatz Ihrer Antworten identifizieren. Sie können entweder AddDefaultCharset wie oben verwenden oder PHP-Code schreiben, der den Header zurückgibt. (Oder Sie können Ihren HTML-Dokumenten ein META-Tag hinzufügen.)


Toller Tipp zur Einstellung func_overload - ermöglicht minimale Änderungen am vorhandenen Code.
Simon East

4
Seien Sie nur vorsichtig - ein Teil des Codes basiert möglicherweise auf der Ein-Byte-pro-Zeichen-Natur der Standardzeichenfolgenfunktionen.
JW.

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 nicht die Überladungsfunktion, um die Standardfunktionen als Multibyte zu verwenden.
Simba

6

Die Unicode-Unterstützung in PHP ist immer noch ein großes Durcheinander. Es ist zwar in der Lage, eine ISO8859-Zeichenfolge (die intern verwendet wird) in utf8 zu konvertieren, es fehlt jedoch die Fähigkeit, nativ mit Unicode-Zeichenfolgen zu arbeiten, was bedeutet, dass alle Zeichenfolgenverarbeitungsfunktionen Ihre Zeichenfolgen beschädigen und beschädigen. Sie müssen also entweder eine separate Bibliothek für die ordnungsgemäße Unterstützung von utf8 verwenden oder alle Funktionen zur Zeichenfolgenbehandlung selbst neu schreiben.

Der einfache Teil besteht darin, nur den Zeichensatz in HTTP-Headern und in der Datenbank usw. anzugeben. Nichts davon ist jedoch von Bedeutung, wenn Ihr PHP-Code kein gültiges UTF8 ausgibt. Das ist der schwierige Teil, und PHP gibt Ihnen dort praktisch keine Hilfe. (Ich denke, PHP6 soll das Schlimmste beheben, aber das ist noch eine Weile entfernt)


6

Wenn Sie möchten, dass der MySQL-Server über den Zeichensatz und nicht über PHP als Client entscheidet (altes Verhalten; meiner Meinung nach bevorzugt), fügen Sie ihn skip-character-set-client-handshakezu Ihrem my.cnf, unter hinzu [mysqld]und starten Sie ihn neu mysql.

Dies kann zu Problemen führen, wenn Sie etwas anderes als UTF8 verwenden.


5

Die beste Antwort ist ausgezeichnet. Folgendes musste ich bei einem regulären Debian / PHP / MySQL-Setup tun:

// storage
// debian. apparently already utf-8

// retrieval
// the mysql database was stored in utf-8, 
// but apparently php was requesting iso. this worked: 
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');

// delivery
// php.ini did not have a default charset, 
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');

// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.

// processing
// changed a few commands in php, like substr,
// to mb_substr

das war alles !


1

Wenn Sie eine MySQL-Lösung wünschen, hatte ich nach einer Servermigration ähnliche Probleme mit zwei meiner Projekte. Nachdem ich viele Lösungen gesucht und ausprobiert hatte, stieß ich auf diese / nichts, bevor diese funktionierte):

mysqli_set_charset($con,"utf8");

Nach dem Hinzufügen dieser Zeile zu meiner Konfigurationsdatei funktioniert alles einwandfrei!

Ich fand diese Lösung https://www.w3schools.com/PHP/func_mysqli_set_charset.asp, als ich eine Einfügung aus einer HTML-Abfrage lösen wollte

Viel Glück!


1

Nur eine Notiz:

Sie sind das Problem des nicht-lateinischen Zeichen zugewandt ist , zeigt , wie ?????????Sie eine Frage gestellt, und es wurde mit einem Hinweis auf diese kanonische Frage geschlossen haben Sie versucht , alles und egal , was man Sie noch tun bekommen ??????????aus MySQL.

Dies liegt hauptsächlich daran, dass Sie Ihre alten Daten testen , die mit dem falschen Zeichensatz in die Datenbank eingefügt und in die eigentlichen Fragezeichen konvertiert und gespeichert wurden ?. Was bedeutet, dass Sie Ihren Originaltext für immer verloren haben und egal was Sie versuchen, Sie erhalten ???????.

Wenn Sie das, was Sie aus den Antworten auf diese Frage gelernt haben, auf neue Daten anwenden, kann dies Ihr Problem lösen.


0

Ich hatte dieses Problem beim Anzeigen von Tabellen. Ich habe dies einfach auf jede Echoausgangsvariable gesetzt:

<td><?php echo utf8_encode ($Local) ?></td>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.