如何在C++中读取Cyrillic Unicode文件?

5
我正在尝试读取已保存为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);
}

对于含有拉丁字符的文件,一切运行正常。但是对于西里尔文文件,我得到的是怪异符号,而不是空格和邻近字符。
例如:
输入文件内容为:
“Госдеп США осудил нападение на”
我得到的结果如下:
“︓осдепР!ШАР>судилР=ападениеР=а”
我做错了什么?

你确定不是输出问题吗?仅仅因为你读入了 Unicode 并不意味着你正在输出到一个 Unicode 环境中。 - Marc B
关于“我做错了什么?”这个问题,我感觉很想轻描淡写地回答“使用C++标准库”,因为它默认应该可以做到这一点。不需要为此去弄清楚如何使用它。或者绕过它。 - Cheers and hth. - Alf
1
gkhh... 俄罗斯政治新闻已经传到了StackOverflow... 不要啊... - user3079266
哦,也许以二进制模式打开文件?试试看。 - Cheers and hth. - Alf
还要注意,在Windows中,0x10FFFF无法适应于Windows的16位“wchar_t”,该类型被指定为“Elem”类型。但是应该能够使用“char32_t”类型。 - Cheers and hth. - Alf
显示剩余8条评论
2个回答

1

在你的代码中,有一行看起来非常可疑:

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

它设置了文件位置,因此从位置1开始读取utf16字符串可能是不正确的(BOM读取不正确)。对于小端序的utf16文件,我得到了相同的结果。

所以你可以将位置更改为0或删除此行,以使此代码正常工作。


我添加了它,因为文件开头有一个奇怪的字符。对于拉丁文件,它运行良好。 - max_hassen
我猜“奇怪的字符在开头”是BOM。 - Alexander

0

好的,找到方法了:

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

这样做很好。我之前没有尝试过,真是太愚蠢了。所以谢谢大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接