2015-05-19 9 views
5

Ich versuche Zeilen aus TXT-Dateien zu lesen, die als Unicode gespeichert wurden. Das ist, wie ich es so mache:Wie kyrillische Unicode-Datei in C++ lesen?

wifstream input; 
string path = "test.txt"; 
input.imbue(locale(input.getloc(), 
     new codecvt_utf16<wchar_t, 0x10ffff, consume_header>)); 

input.open(path); 
if (input.is_open()) 
{ 
    wstring line; 
    input.seekg(1 , ios_base::beg); 
    getline(input, line); 
} 

Es funktioniert für Dateien mit lateinischen Zeichen in Ordnung. Aber für kyrillische Dateien bekomme ich seltsame Symbole statt Leerzeichen und benachbarte Zeichen.

Zum Beispiel:

Was in der Eingabedatei ist:

Госдеп США осудил нападение на

Was ich:

︓осдепР ШАР> судилР = ападениеР = а

Was mache ich falsch?

+0

sicher ist es kein Ausgabeproblem? Nur weil du Unicode liest, bedeutet das nicht, dass du in eine Unicode-Umgebung ausgibst. –

+0

Ich würde diese Zeile entfernen: input.imbue (locale (input.getloc(), neue codecvt_utf16 )); – duDE

+0

Re "Was mache ich falsch?", Ich fühle mich sehr wie glatt und antworten "Verwenden der C++ - Standard-Bibliothek", weil es dies standardmäßig tun sollte. Es sollte nicht notwendig sein, herauszufinden, wie man es dafür benutzt. Oder umgehen Sie es. –

Antwort

0

Gut zu machen, heraus den Weg:

FILE *input= _wfopen(L"test.txt", L"rb"); 
wchar_t line[1000]; 
test.txtfgetws(line, 1000, input); 

funktioniert gut so. War ziemlich dumm von mir, es nicht zuerst zu versuchen. Also danke an alle.

1

eine Zeile sieht in Ihrem Code sehr suspicous:

input.seekg(1, ios_base::beg);

es Dateiposition setzt, so utf16 String Leseposition 1 Start möglicherweise falsch (BOM gelesen falsch). Ich habe das gleiche Ergebnis für utf16 Datei in Little Endian.

so können Sie Position auf 0 ändern oder diese Zeile löschen, um diesen Code Arbeit

+0

Ich habe es hinzugefügt, weil es am Anfang der Datei ein komisches Zeichen gibt. Es funktionierte gut für lateinische Dateien. –

+0

"seltsame Zeichen am Anfang" ist BOM, denke ich – Alexander