Ist die Prüfung für UTF-8 strings in PHP eine zuverlässige Methode?

Ich gefunden habe, eine nützliche Funktion auf eine andere Antwort und ich Frage mich, wenn jemand könnte mir erklären, was es macht und ob es zuverlässig ist. Ich war mit mb_detect_encoding(), aber es war falsch, beim Lesen von einem ISO 8859-1-Datei auf einem Linux-OS.

Diese Funktion scheint zu funktionieren, in allen Fällen, die ich getestet.

Hier ist die Frage: Get file encoding

Hier ist die Funktion:

function isUTF8($string){
    return preg_match('%(?:
    [\xC2-\xDF][\x80-\xBF]              # Non-overlong 2-byte
    |\xE0[\xA0-\xBF][\x80-\xBF]         # Excluding overlongs
    |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # Straight 3-byte
    |\xED[\x80-\x9F][\x80-\xBF]         # Excluding surrogates
    |\xF0[\x90-\xBF][\x80-\xBF]{2}      # Planes 1-3
    |[\xF1-\xF3][\x80-\xBF]{3}          # Planes 4-15
    |\xF4[\x80-\x8F][\x80-\xBF]{2}      # Plane 16
    )+%xs', $string);
}

Ist dies eine sichere Möglichkeit, die Erkennung von UTF-8 strings?
Was genau macht es? Es kann robuster gemacht werden?

  • Warum nicht so etwas wie mb_detect_encoding (php.net/manual/en/function.mb-detect-encoding.php)?
  • Möchte nur erwähnen, dass diese Funktion denkt, dass "1" ein string ist nicht utf8, während es ist (zu sein klar, es ist nur ein ascii -, aber es ist immer noch aufgenommen werden sollte utf8)
  • haben Sie Lesen die Frage überhaupt?
  • Habe gelesen, dass die Frage, aber ich erinnere mich nicht, zu sehen, dass Sie wurden mit mb_detect_encoding früher; sorry about that. Ich denke immer noch, es lohnt sich mit mb_detect_encoding hier, obwohl... selbst wenn es eingehüllt in etwas anderes. Überprüfen Sie heraus diesen Kommentar von Greg Theiß als auch, wenn Sie die chance haben, über die Verwendung des "strict-Modus" (php.net/manual/en/function.mb-detect-encoding.php#102510)
  • Es sollte angemerkt werden, dass die Funktion geschrieben in der Frage NICHT eigentlich erkennen, ob ein beliebiger string gültiges UTF-8. Es erkennt nur wenn der string ENTHÄLT "nicht-ascii multibyte-Sequenzen in UTF-8-Reihe". Also ein reiner ascii-string wie "hello world" würde der test als nicht bestanden. Siehe meine Antwort unten für eine detaillierte Erklärung, wo diese Funktion kam.
Schreibe einen Kommentar