Entfernen ungültiger / unvollständiger Multibyte-Zeichen

8

Ich habe einige Probleme mit dem folgenden Code für Benutzereingaben:

%Vor%

Wenn ein ungültiges Multibyte-Zeichen erkannt wird, gibt PHP einen Hinweis:

  

PHP Warnung: htmlentities (): Ungültige Multibyte-Sequenz in Argument in /path/to/file.php in Zeile 123

Mein erster Gedanke war, den Fehler zu unterdrücken, aber das ist langsam und schlechte Praxis: Ссылка

Mein zweiter Gedanke war die Verwendung des ENT_IGNORE-Flags, aber selbst das PHP-Handbuch schlägt vor, dies nicht zu verwenden:

  

Verwerfen Sie ungültige Code-Unit-Sequenzen unbemerkt, anstatt eine leere Zeichenfolge zurückzugeben. Es wird davon abgeraten, dieses Flag zu verwenden, da dies » Auswirkungen auf die Sicherheit haben kann .

Ein weiterer Grund führte mich zu folgendem Code:

%Vor%

Leider wirft iconv auch ein E_NOTICE, wenn ungültige Zeichen entfernt / ignoriert werden:

  

Wenn Sie den String // TRANSLIT an out_charset anhängen, wird die Transliteration aktiviert. Dies bedeutet, dass, wenn ein Zeichen nicht im Zielzeichensatz dargestellt werden kann, es durch ein oder mehrere ähnlich aussehende Zeichen angenähert werden kann. Wenn Sie die Zeichenfolge // IGNORE anhängen, werden Zeichen, die nicht im Zielzeichensatz dargestellt werden können, automatisch verworfen. Andernfalls wird str von dem ersten unzulässigen Zeichen abgeschnitten und ein E_NOTICE erzeugt.

Ich habe also hier keine Optionen. Ich würde lieber eine erprobte und getestete Bibliothek verwenden, um mit dieser Art von Dingen umzugehen, als mit einigen der auf regulären Ausdrücken basierenden Lösungen zu experimentieren, die ich gesehen habe.

Das führt mich zu meiner letzten Frage: Wie kann ich ungültige Multibyte-Zeichen effizient, sicher, ohne Hinweise / Warnungen / Fehler entfernen?

    
Dean 09.03.2012, 08:59
quelle

2 Antworten

2
  

Wie kann ich ungültige Multibyte-Zeichen effizient, sicher, ohne Hinweise / Warnungen / Fehler entfernen?

Nun, wie Sie bereits in Ihrer Frage ( oder zumindest verlinkt ) beschrieben haben, löschen Sie die ungültige Bytefolge (n) ist keine Option.

Stattdessen sollte es wahrscheinlich durch das Ersatzzeichen U + FFFD ersetzt werden. Ab PHP 5.4.0 können Sie das ENT_SUBSTITUTE -Flag für htmlentities verwenden. Das ist wahrscheinlich am sichersten, wenn Sie die Zeichenfolge nicht ablehnen möchten.

iconv wird Sie immer in neueren PHP-Versionen warnen, wenn Sie nicht die ganze Zeichenfolge löschen. Es sieht also nicht nach einer guten Alternative für dich aus.

    
hakre 10.03.2012, 23:52
quelle
4

iconv('UTF-8', "ISO-8859-1//IGNORE", $string);

hat sehr gut für mich funktioniert. Scheint nicht zu bemerken.

    
Nicholas Pickering 14.03.2013 16:44
quelle

Tags und Links