【问题标题】:How to read Cyrillic Unicode file in C++?如何在 C++ 中读取 Cyrillic Unicode 文件?
【发布时间】:2015-07-31 12:01:18
【问题描述】:

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

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 环境。
  • 我会删除这一行:input.imbue(locale(input.getloc(), new codecvt_utf16));
  • Re“我做错了什么?”,我感觉很喜欢油嘴滑舌并回答“使用 C++ 标准库”,因为默认情况下它应该这样做。没有必要弄清楚如何使用它。或者解决它。
  • gkhh...俄罗斯政治新闻进入 StackOverflow...Noooo...
  • 哦,也许以二进制模式打开文件?试试看。

标签: c++ unicode locale getline cyrillic


【解决方案1】:

您的代码中有一行看起来很可疑:

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

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

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

【讨论】:

  • 我添加了它,因为文件开头有一个奇怪的字符。它适用于拉丁文文件。
  • “开头的奇怪字符”我猜是BOM
【解决方案2】:

嗯,找到方法了:

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

像这样工作得很好。不先尝试的我真是太愚蠢了。 所以谢谢大家。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多