Sie können sich nicht darauf verlassen, dass die Datei eine Stückliste enthält. UTF-8 benötigt es nicht. Und Nicht-Unicode-Codierungen haben nicht einmal eine Stückliste. Es gibt jedoch andere Möglichkeiten, die Codierung zu erkennen.
UTF-32
Die Stückliste ist 00 00 FE FF (für BE) oder FF FE 00 00 (für LE).
UTF-32 ist jedoch auch ohne Stückliste leicht zu erkennen. Dies liegt daran, dass der Unicode-Codepunktbereich auf U + 10FFFF beschränkt ist und UTF-32-Einheiten daher immer das Muster 00 {00-10} xx xx (für BE) oder xx xx {00-10} 00 (für LE) haben. . Wenn die Daten eine Länge haben, die ein Vielfaches von 4 ist und einem dieser Muster folgt, können Sie davon ausgehen, dass es sich um UTF-32 handelt. False Positives sind aufgrund der Seltenheit von 00 Bytes in byteorientierten Codierungen nahezu unmöglich.
US-ASCII
Keine Stückliste, aber Sie brauchen keine. ASCII kann leicht durch das Fehlen von Bytes im 80-FF-Bereich identifiziert werden.
UTF-8
Stückliste ist EF BB BF. Aber darauf kann man sich nicht verlassen. Viele UTF-8-Dateien haben keine Stückliste, insbesondere wenn sie von Nicht-Windows-Systemen stammen.
Sie können jedoch davon ausgehen, dass eine Datei, die als UTF-8 validiert wird, UTF-8 ist. False Positives sind selten.
Insbesondere da die Daten nicht ASCII sind, beträgt die falsch positive Rate für eine 2-Byte-Sequenz nur 3,9% (1920/49152). Bei einer 7-Byte-Sequenz sind es weniger als 1%. Bei einer 12-Byte-Sequenz sind es weniger als 0,1%. Bei einer 24-Byte-Sequenz ist es weniger als 1 zu 1 Million.
UTF-16
Stückliste ist FE FF (für BE) oder FF FE (für LE). Beachten Sie, dass sich die UTF-16LE-Stückliste am Anfang der UTF-32LE-Stückliste befindet. Überprüfen Sie daher zuerst UTF-32.
Wenn Sie zufällig eine Datei haben, die hauptsächlich aus ISO-8859-1-Zeichen besteht, ist es auch ein starker Indikator für UTF-16, wenn die Hälfte der Bytes der Datei 00 ist.
Andernfalls besteht die einzige zuverlässige Möglichkeit, UTF-16 ohne Stückliste zu erkennen, darin, nach Ersatzpaaren (D [8-B] xx D [CF] xx) zu suchen. Nicht-BMP-Zeichen werden jedoch zu selten verwendet, um diesen Ansatz praktikabel zu machen .
XML
Wenn Ihre Datei mit den Bytes 3C 3F 78 6D 6C beginnt (dh den ASCII-Zeichen "<? Xml"), suchen Sie nach einer encoding=
Deklaration. Wenn vorhanden, verwenden Sie diese Codierung. Wenn nicht vorhanden, nehmen Sie UTF-8 an, die Standard-XML-Codierung.
Wenn Sie EBCDIC unterstützen müssen, suchen Sie auch nach der entsprechenden Sequenz 4C 6F A7 94 93.
Wenn Sie ein Dateiformat haben, das eine Codierungsdeklaration enthält, suchen Sie im Allgemeinen nach dieser Deklaration, anstatt zu versuchen, die Codierung zu erraten.
Nichts des oben Genannten
Es gibt Hunderte anderer Codierungen, deren Erkennung mehr Aufwand erfordert. Ich empfehle, Mozillas Zeichensatzdetektor oder einen .NET-Port davon zu testen .
Ein vernünftiger Standard
Wenn Sie die UTF-Codierungen ausgeschlossen haben und keine Codierungsdeklaration oder statistische Erkennung haben, die auf eine andere Codierung hinweist, nehmen Sie ISO-8859-1 oder das eng verwandte Windows-1252 an . (Beachten Sie, dass der neueste HTML-Standard erfordert, dass eine „ISO-8859-1“ -Deklaration als Windows-1252 interpretiert wird.) Als Windows-Standardcodepage für Englisch (und andere beliebte Sprachen wie Spanisch, Portugiesisch, Deutsch und Französisch). Es ist die am häufigsten anzutreffende Codierung außer UTF-8.