2017-05-11 6 views
3

Ich versuche, eine Datei zu lesen, die einen beliebigen Zeichensatz/codePage haben kann, aber ich nicht, welches Gebietsschema zu setzen, um die Datei richtig zu lesen.Detect Zeichensatz der Datei dynamisch in C++

Unten ist mein Code-Snippet, in dem ich versuche, eine Datei mit Zeichensatz als Windows-1256 zu lesen, aber ich möchte den Zeichensatz dynamisch aus der Datei lesen, so dass ich das Gebietsschema entsprechend einstellen kann.

std::wifstream input{ filename.c_str() }; 
std::wstring content{ std::istreambuf_iterator<wchar_t>(input1), std::istreambuf_iterator<wchar_t>() }; 
input.imbue(std::locale(".1256")); 
contents = ws2s(content); // Convert wstring to CString 

Antwort

2

Im Allgemeinen ist es unmöglich, den Inhalt einer Nur-Text-Datei allein genau zu verwenden. Normalerweise sollten Sie sich auf externe Informationen verlassen. Wenn die Datei beispielsweise mit HTTP heruntergeladen wurde, sollte die Codierung innerhalb eines Antwortheaders empfangen werden.

Einige Dateien können Informationen zur Codierung enthalten, die im Dateiformat angegeben sind. XML zum Beispiel: <?xml version="1.0" encoding="XXX"?>.

Unicode-Kodierungen können erkannt werden, wenn die Datei mit einer Byte Order Mark beginnt - was optional ist.

Sie können normalerweise davon ausgehen, dass die Codierung ein breites Zeichen verwendet, wenn die Datei vor dem Ende der Datei ein Nullbyte enthält, das den Zeichenfolgenabschluss als schmales Zeichen darstellt. Wenn Sie zwei aufeinanderfolgende Nullen finden, die an einer 2-Byte-Grenze (vor dem Ende) ausgerichtet sind, ist die Kodierung wahrscheinlich 4 Byte breit.

Darüber hinaus könnten Sie versuchen, die Codierung anhand der Häufigkeit bestimmter Zeichen zu erraten. Dies kann einige unintended consequences haben.

+0

Es gibt keine vollständige Beweismethode zur Bestimmung von Zeichensatz, aber wir können hierfür die ICU-Bibliothek verwenden, die eine heuristikbasierte Lösung bietet. Ich habe ein Schnipsel von https://github.com/mooz/node-icu-charset-detector/blob/master/node-icu-charset-detector.cpp –

+0

@SaurabhKathpalia ja, Outsourcing in eine Bibliothek ist ein guter Weg zu Sparen Sie Zeit und Mühe. Denken Sie nur an die möglichen Fallstricke des heuristischen Ansatzes (der letzte Link meiner Antwort ist ein praktisches Beispiel für eine solche Falle). – user2079303

1

mich stumpf sein lassen und sagen: Sie können mich

Lassen Sie, dass qualifizieren: eine Datei einfach Tonnen von 0 und 1 auf Ihrer Festplatte geklebt ist. Ein Zeichensatz ist eine Möglichkeit, diese Nullen und Einsen zu interpretieren. Sie müssen die Informationen zur Verfügung stellen, wie sie zu interpretieren sind, nämlich durch Angabe eines Zeichensatzes.

Eine typische Vorgehensweise ist das Schreiben einer Kopfzeile zur Angabe des Zeichensatzes.

Dies ist ein HTML-Header

<head> 
    <title>Page Title</title> 
    <meta charset="UTF-8"> 
</head> 

Wie Sie das charset sehen können, müssen eine oder andere Weise angegeben werden.

Hin und wieder sehen Sie einige Rogue-Anwendung raten einen Zeichensatz, sie tun dies oft mit einigen Heuristiken auf die Verteilung von Bytes, aber das ist nicht zuverlässig und führt oft zu Kauderwelsch.

Als eine Randnotiz, versuchen Sie UTF-8 everywhere verwenden, sind die anderen, um es leicht, unordentlich zu setzen.