如何在C ++中阅读西里尔文Unicode文件?

时间:2015-05-19 15:03:50

标签: c++ unicode locale getline cyrillic

我正在尝试读取已保存为Unicode的.txt文件中的行。 这就是我在做的方式:

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

它适用于具有拉丁字符的文件。 但对于西里尔文件,我得到奇怪的符号而不是空格和相邻字符。

例如:

输入文件中包含的内容:

  

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

我得到了什么:

  !

︓осдепРШАР&GT;судилР=ападениеР=а

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你的代码中有一行非常可疑:

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

它设置文件位置,因此读取utf16字符串起始位置1可能不正确(BOM读取不正确)。我对小端的utf16文件有相同的结果。

因此您可以将位置更改为0或删除此行以使此代码正常工作

答案 1 :(得分:0)

好吧,想通了路:

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

这样做很好。对我来说,不要先尝试它是非常愚蠢的。 非常感谢大家。