Wie ersetzen/entfernen 4(+)-byte-Zeichen aus UTF-8-Strings in PHP?
Wie es scheint, MySQL nicht unterstützt Charaktere mit mehr als 3 bytes in seiner Standard-UTF-8-Zeichensatz.
So, in PHP, wie kann ich loszuwerden, alle 4 (und mehr)-byte-Zeichen in einer Zeichenfolge und ersetzt Sie mit etwas, wie von einigen anderen Zeichen?
- Sind Sie sicher, dass die Daten, die Sie gehen, um mit zu betreiben, wird immer die Zeichen enthalten, die nicht passen in die mysql-3-byte-utf8?
- Sind Sie sicher, dass es noch ähnliche Charaktere? 3 bytes geben Sie das ganze Basic Multilingual Plane; wenn Ihr brauchen die viel seltenere Zeichen über, betrachten eine andere Unicode-Kodierung (z.B. utf-16).
- Das problem ist, ich möchte vermeiden, die anderen, weil MySQL kürzt Texte an diesem Punkt, dass, wenn jemand stellt eines dieser Sonderzeichen drin.
- Hier ist das ticket: fluxbb.org/development/core/tickets/485
- Tut mir Leid, aber das ist sehr viel wie zu sagen: "Nun,
ß
undž
undḉ
passt nicht in ASCII, also lasst Sie inss
undz
undc
; Verlust von Sinn und grammatikalische Richtigkeit? I don ' T care." - Ich dachte MySQL hatte, wurde dieser Fehler behoben?
- Vielleicht in neueren Versionen...
- MySQL unterstützt diese Zeichen, die jetzt durch die utf8mb4 charset.
- wenn meine Antwort unten ist ok, bitte klicken Sie auf gray 'check' auf der linken Seite (unten Punkte)
Du musst angemeldet sein, um einen Kommentar abzugeben.
HINWEIS: Sie sollten nicht nur Streifen, sondern ersetzen mit Ersatz Zeichen U+FFFD zu vermeiden unicode-Attacken, meist XSS:
http://unicode.org/reports/tr36/#Deletion_of_Noncharacters
Seit 4-byte-UTF-8-Sequenzen beginnen immer mit den bytes
0xF0-0xF7
, sollten die folgenden arbeiten:Alternativ können Sie
preg_replace
im UTF-8-Modus, aber das wird wohl etwas langsamer sein:Dies funktioniert, weil die 4-byte-UTF-8-Sequenzen verwendet werden, die für die code-Punkte in der ergänzenden Unicode-Ebenen ab
0x10000
.Hier ein Beispiel:
Oder, ein wenig kompakter und effizienter:
mbstring
- Erweiterung?Kam in dieser Frage, wenn Sie versuchen, meine eigenen zu lösen Problem (Facebook spuckt bestimmte emoticons als 4-byte-Zeichen, Amazon Mechanical Turk nicht akzeptiert 4-byte-Zeichen).
Landete ich mit diesen ist, nicht verlangen, mbstring-Erweiterung:
Unten Funktion ändern 3-und 4-Byte-Zeichen aus utf8-Zeichenfolge '#':
Hier ist meine Umsetzung zu-filter-Ausgang 4-byte-chars
könnten Sie optimieren und ersetzen
null
(die entfernt den char), mit ein paar Ersatz-string. Sie können auch ersetzen>= 4
mit einigen anderen byte-Länge überprüfen.