2016-05-30 24 views
0

Ich habe eine einfache (benutzerdefinierte) CMS akzeptieren Markdown und zeigt es in einer Webseite. Funktioniert in php5.6 (mit dem ondrej/php5 ppa auf ubuntu 15.10). Die Mysql-Sortierung ist überall auf utf8 eingestellt.utf8 Codierung bricht bei der Aktualisierung von PHP5.6 auf PHP7.0

Aktualisieren Sie den Server auf php7.0 (ondrej/php), und es zeigt ungültige Zeichen an. Ich habe versucht, die relevanten mysql Tabellen und Felder zu utf8mb4/utf8mb4_unicode_ci ohne Glück zu migrieren.

Downgrade auf php5.6 und alles funktioniert gut. Ich habe eine Ahnung, es ist eine seltsame PHP-Einstellung, über die ich nicht weiß? php.ini default_collation = UTF-8. Konnte nichts anderes finden, das funktionierte. phpMyAdmin zeigt Müll an, egal welche Version von php oder Server Einstellungen, so dass es nicht viel hilft. Was könnte ich als nächstes versuchen?

Quelltext (kopiert von php5.6 gerenderte Seite)

아동 보호 정책에 대한 규정 
This Code is part of the 

gerenderte Ausgabe (von php7 und phpMyAdmin)

ì•„ë™ ë³´í˜¸ ì •ì±…ì— ëŒ€í•œ ê·œì • 
This Code is part of the 
+0

Welche PHP MySQL-Bibliothek verwenden Sie und nutzen Sie das exakt gleiche Skript? (Wenn es das gleiche Skript ist, hat es zufällig Unterstützung für zwei verschiedene Bibliotheken und konfiguriert sie anders?) –

+1

Wenn phpmyadmin Müll anzeigt, bedeutet das, dass Sie tatsächlich Müll in Ihrer Datenbank haben, weil Sie bisher die Codierung schlecht gehandhabt haben. Ein paar Hintergrundinformationen finden Sie in [Behandlung von Unicode in einer Webanwendung rückwärts] (http://kunststube.net/frontback/). – deceze

+0

@deceze es sieht aus wie du bist richtig. Ich denke, ich habe Müll in der Tabelle. Ich habe den Testcode ausprobiert und es hat perfekt funktioniert. Ich sehe meinen Fehler noch nicht ganz, da ich denke, dass ich alle (wichtigen) Anweisungen dort befolgt habe. Also: Wie ermittle ich, welchen Zeichensatz ich tatsächlich in den Feldern habe? Es kann möglich sein, zu korrekten utf8 zu konvertieren? – Steve

Antwort

1

verwenden eine Tabelle utf8mb4 zu ändern:

ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATION utf8mb4_unicode_520_ci; 

Wenn jedoch die Tabelle bereits durcheinander war, dann wird dies nicht behoben. Gehen Sie folgendermaßen zu überprüfen:

SELECT col, HEX(col) FROM tbl WHERE ... 

Zum Beispiel 아동 보호 정책에 대한 규정 zeigt einen Hex von EC9584 EB8F99 EBB3B4 ED98B8 ECA095 ECB185 EC9790 EB8C80 ED959C EAB79C ECA095. (Bitte ignorieren Sie die Leerzeichen.)

Für koreanischen Text sollten Sie (meistens) Gruppen von 3 Hex-Bytes der Form Ewxxyy sehen, wobei w A oder B oder C oder D ist, wie im obigen Beispiel gezeigt. Hex 20 (nur 1 Byte) repräsentiert ein Leerzeichen.

ì•„ë™ ë³´í˜¸ ì •ì±…ì— ëŒ€í•œ ê·œì • ist der Mojibake dafür. Dies bedeutet, dass irgendwo latin1 irrtümlich beteiligt war, wahrscheinlich, wenn Sie den Text INSERTed. In diesem Fall sehen Sie etwas wie C3AC E280A2 E2809E C3AB C28F E284A2 C3AB C2B3 C2B4 C3AD CB9C C2B8 ... - meist 2-Byte Cwxx hex.

Wenn Sie sehen, dass ein UPDATE von so etwas wie dies die Daten reparieren: CONVERT(BINARY(CONVERT(CONVERT(col USING utf8mb4) USING latin1)) USING utf8mb4)(Edit:. Entfernt Aufruf UNHEX)

+0

Danke für die ausführliche Antwort: Das ist sehr ähnlich dem, was ich vor ein paar Tagen nach vielem Googlen und Kopfkratzen tat (siehe die Anmerkungen in den Kommentaren zu der Frage). Die verwendete SQL war column_name = convert (cast (convert (column_name using latin1) als binary) mit utf8) from http://stackoverflow.com/questions/9407834/mysql-convert-latin1-characters-on-a-utf8- table-in-utf8, weil meine Spalten in utf8 nicht utf8mb4 waren. Danke nochmal für die hervorragend fokussierte Antwort – Steve

+0

Hoppla, ich hatte einen falschen 'UNHEX()' Anruf. –

+1

Es gibt viele Varianten des Ausdrucks. Ich vermute, beide haben identische Wirkung. –

Verwandte Themen