2015-05-19 20 views
5

Próbuję odczytać linie z plików .txt, które zostały zapisane jako Unicode. To jak ja to robię:Jak czytać cyrylicę w Unicode w C++?

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); 
} 

To działa dobrze dla plików z alfabetu łacińskiego. Ale dla plików cyrylicą otrzymuję dziwne symbole zamiast spacji i sąsiednich znaków.

Na przykład:

Co znajduje się w pliku wejściowego:

Госдеп amerykański осудил нападение на

Co dostaję:

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

Co robię źle?

+0

czy to nie jest problem z wyjściem? tylko dlatego, że czytasz w unicode, nie oznacza, że ​​przechodzisz do środowiska unicode. –

+0

Chciałbym usunąć tę linię: input.imbue (locale (input.getloc(), new codecvt_utf16 )); – duDE

+0

Re "Co robię źle?", Czuję się bardzo jak bycie glibem i odpowiadanie na "Korzystanie ze standardowej biblioteki C++", ponieważ powinno to robić domyślnie. Nie powinno być konieczne, aby dowiedzieć się, jak go użyć w tym celu. Lub obejść to. –

Odpowiedz

0

Cóż, zorientowali się okazji:

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

działa dobrze tak. Byłem głupi, że nie spróbowałem tego pierwszy. Dziękuję wszystkim.

1

jedna linia wygląda bardzo suspicous w kodzie:

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

ustawia położenie pliku, więc czytanie UTF16 ciąg Pozycja wyjściowa 1 może być nieprawidłowy (BOM jest błędnie odczytać). Mam taki sam wynik dla pliku utf16 w małym endianie.

więc może zmienić pozycję 0 lub usunąć tę linię, aby uczynić tę pracę kodu

+0

Dodałem, że na początku pliku jest dziwna postać. To działało dobrze dla plików łacińskich. –

+0

"dziwna postać na początku" to BOM, chyba – Alexander