【问题标题】:Reading unicode text files in Visual C++在 Visual C++ 中读取 unicode 文本文件
【发布时间】:2011-03-05 16:58:06
【问题描述】:

我正在尝试在 Visual C 中读取一个只有一些数字的简单 unicode (UTF-16) 文本文件。这似乎是一项微不足道的任务,但我无法让它以正确的编码读取文件。

我的文件如下所示:

1337 42 23

由于是unicode,所以开头也有0xFF 0xFE BOM标记。

我尝试过wifstream()fwscanf(),但都被 BOM 卡住了,甚至在跳过 BOM 之后,这两个函数都只读取“1”(它们对 0x00 字符感到困惑,即它们不是实际上以 unicode 格式读取文件)。

所以,问题是,如何在 unicode Visual C++ 应用程序中读取和解析简单的 unicode 文件?

这是我的来源(fwscanf 版本):

int _tmain(int argc, _TCHAR* argv[])
{
    int x;
    FILE * f = _wfopen(L"bla.txt", L"r+");
    if (!f) return -1;

    fseek(f, 2, SEEK_SET); // skip the BOM mark

    fwscanf(f, L"%d", &x);
    wprintf(L"Number read: %d\n", x);

    fclose(f);
    return 0;
}

输出是:

Number read: 1

【问题讨论】:

    标签: c++ visual-c++ file unicode utf-16


    【解决方案1】:

    Microsoft CRT 从 VS2005 开始支持 BOM 自动检测。您可以通过使用 mode 参数中的“ccs”属性来启用它。像这样:

    FILE * f = _wfopen(L"c:\\temp\\test.txt", L"rt, ccs=UNICODE");
    

    如果文件没有 BOM,它会退回到 ansi。对于这样的麻烦制造者,您可以使用“UTF-8”或“UTF-16LE”。这当然是不标准的。

    【讨论】:

    • 谢谢! Mat 的解决方案也有效,但这个更干净一些。我想知道为什么 unicode 不是 unicode 应用程序中的首选编码。再说一次,这不是 Visual Studio 中没有意义的第一件事。
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2018-06-22
    • 2011-04-06
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2014-03-19
    相关资源
    最近更新 更多