UTF-8-Codierung erkennen (Wie macht MS IDE das?)
Ein Problem bei verschiedenen Zeichenkodierungen besteht darin, dass die enthaltene Datei nicht immer klar gekennzeichnet ist. Es gibt inkonsistente Konventionen für das Markieren einiger mit "Bytereihenfolge-Markern" oder Stücklisten. Aber im Grunde muss man seinerzählte Was ist die Dateicodierung, um es genau zu lesen.
Wir bauen Programmiertools, die Quelldateien lesen, und das macht uns Sorgen. Wir haben die Möglichkeit, Standardeinstellungen festzulegen und Stücklisten usw. zu prüfen. Und wir kommen mit Konventionen und Standardeinstellungen ziemlich gut zurecht. Aber ein Ort, an dem wir (und ich nehme an, alle anderen) hängen bleiben, sind UTF-8-Dateien, die nicht BOM-markiert sind.
Aktuelle MS-IDEs (z. B. VS Studio 2010) "riechen" anscheinend an einer Datei, um festzustellen, ob sie UTF-8-codiert ist, ohne dass eine Stückliste vorhanden ist. (Da wir im Werkzeuggeschäft tätig sind, möchten wir aufgrund ihres Marktanteils mit MS kompatibel sein, auch wenn dies bedeutet, dass wir mit ihnen die "dumme" Klippe überwinden müssen.) Ich interessiere mich speziell für das, was sie als Werkzeug verwenden Heuristik (obwohl Diskussionen über Heuristik in Ordnung sind)? Wie kann es "richtig" sein? (Betrachten Sie eine ISO8859-x-codierte Zeichenfolge, die auf diese Weise interpretiert wird.)
BEARBEITEN: Dieser Artikel zum Erkennen von Zeichencodierungen / -sätzen ist ziemlich interessant:http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
BEARBEITEN Dezember 2012: Wir haben das Scannen der gesamten Datei beendet, um festzustellen, ob Verstöße gegen UTF-8-Sequenzen vorliegen. Andernfalls wird die Datei als UTF-8 bezeichnet. Der schlechte Teil dieser Lösung ist, dass Sie die Zeichen zweimal verarbeiten müssen, wenn es sich um UTF-8 handelt. (Wenn es sich nicht um UTF-8 handelt, wird dieser Test dies wahrscheinlich ziemlich schnell feststellen, es sei denn, die Datei wird mit allen 7-Bit-ASCII-Dateien erstellt, und an diesem Punkt schadet das Lesen von UTF-8 nicht.)