2017-02-08 1 views
1

Die Datei ist UTF-8 (65001) codiert. Ich kann keine kyrillischen Symbole daraus lesen.C++ Kann kyrillischen UTF-8-Text nicht aus Datei lesen

CString FNAME; 
CStdiofile fNFR; 

fNFR.Open(_T("LFS200.25"), CFile::modeRead); 
fNFR.ReadString(FNAME); 

Und bekam dies:

Зимний максимум 1989/90 гг. 

statt dessen:

Зимний максимум 1989/90 гг. 

Versuchte

setlocale(LC_ALL, "Rus"); 

noch das gleiche Problem.

Wie bekomme ich die richtige Zeichenfolge?

+1

* Dies ist * UTF8. C++ hat 16-Bit-Zeichen (char16_t) und Zeichenfolgen, aber UTF8-Zeichenfolgen werden als Zeichen behandelt. Wenn Sie die UTF8-Bytes in UTF16 konvertieren möchten, benötigen Sie Codecvt –

+1

Überprüfen Sie [diese Frage auf UTF-Unterstützung in C++] (http://stackoverflow.com/questions/6796157/unicode-encoding-for-string-literals-in-c11) und die Seite [String and Character Literals] (https://msdn.microsoft.com/en-us/library/69ze775t.aspx) in MSDN –

+1

Überprüfen Sie [codecvt_utf8_utf16] (http://en.cppreference.com/w/cpp/locale/codecvt_utf8_utf16). Sie sollten in der Lage sein, Ihre UTF8-Zeichenfolge in UTF16 zu konvertieren mit 'std :: u16string u16_conv = std :: wstring_convert , char16_t> {}. From_bytes (u8);' –

Antwort

0

fand ich die Antwort hier (müssen utf-8 bis utf-16 konvertieren):

CONVERSION BETWEEN UNICODE UTF-16 AND UTF-8 IN C++/WIN32

+0

Das ist * nicht * eine gute Lösung. Es wurde vor 7 Jahren geschrieben, als C++ keine native Unicode-Unterstützung hatte. Am Ende ist es nur ein Aufruf an "WideCharToMultiByte". Ich bin 100% sicher, dass der Autor Ihnen heute sagen würde "Tu das nicht!". –

+1

Oder [initialisieren Sie CStdioFile mit einem UTF8 FILE-Stream] (http://stackoverflow.com/a/17378096/134204) –