Ich erhalte vom Benutzer Konsoleneingaben und möchte sie in UTF-8 kodieren. Mein Verständnis ist C ++ hat keine Standard-Codierung für Eingabe-Streams, und dass es stattdessen auf den Compiler, die Laufzeitumgebung, Lokalisierung und was nicht.
Wie kann ich die Eingabecodierung bestimmen, indem ich die Bytes der Eingabe überprüfe?
Im Allgemeinen können Sie nicht. Wenn ich einen Strom zufällig generierter Bytes in deiner App schieße, wie kann er ihre "Kodierung" bestimmen? Sie müssen lediglich angeben, dass Ihre Anwendung bestimmte Codierungen akzeptiert, oder eine Annahme treffen, dass das, was das Betriebssystem übergibt, entsprechend codiert wird.
Im Allgemeinen zu überprüfen, ob Eingabe UTF ist, ist eine Frage der Heuristik - es gibt keinen definitiven Algorithmus, der Sie mit "Ja / Nein" ausweist. Je komplexer die Heuristik, desto weniger falsche Positive / Negative erhalten Sie, aber es gibt keinen "sicheren" Weg.
Ein Beispiel für Heuristiken finden Sie in dieser Bibliothek: Ссылка
%Vor%Sie können es entweder verwenden oder seine Quellen überprüfen, wie sie es getan haben.
Verwenden Sie das integrierte Betriebssystem Mittel. Diese variieren von Betriebssystem zu Betriebssystem. Unter Windows ist es immer besser, WideChar-APIs zu verwenden und überhaupt nicht zu codieren.
Und wenn Ihre Eingabe von einer Datei kommt, im Gegensatz zu einer echten Konsole, sind alle Wetten deaktiviert.
Jared Oberhaus hat das auf einer verwandten Frage , die spezifisch für Java ist, gut beantwortet.
Grundsätzlich gibt es ein paar Schritte, die Sie ergreifen können, um eine vernünftige Schätzung zu machen, aber letztlich ist es nur Vermutung ohne explizite Angabe. (Daher der (in) berühmte BOM-Marker in UTF-8-Dateien)
Wie bereits in Reaktion auf die Frage gesagt wurde, hat John Weldon auf gibt es eine Reihe von Bibliotheken, die Zeichencodierungserkennung durchführen. Sie können auch einen Blick auf die
Quelle des Unix file
-Befehls und sehen, welche Tests verwendet, um Dateicodierung zu bestimmen. Auf der Manpage von file
:
ASCII, ISO-8859-x, Nicht-ISO 8-Bit-ASCII-Zeichensätze (wie sie auf Macintosh- und IBM PC-Systemen verwendet werden), UTF-8-codierter Unicode, UTF-16-codierter Unicode und EBCDIC-Zeichensätze können durch die verschiedenen Bereiche und Sequenzen von Bytes unterschieden werden, die in jedem Satz druckbaren Text darstellen.
PCRE bietet eine Funktion zum Testen einer gegebenen Zeichenkette auf ihre vollständige Gültigkeit UTF-8.