【问题标题】:Read Unicode files C++读取 Unicode 文件 C++
【发布时间】:2009-05-23 12:45:56
【问题描述】:

我有一个简单的问题要问。我有一个以 FFFE 开头的 UTF 16 文本文件可供阅读。处理这种文件的 C++ 工具有哪些?我只想阅读它,过滤一些行并显示结果。

它看起来很简单,但我只是有处理纯 ascci 文件的经验,而且我很着急。我正在使用 VS C++,但我不想使用托管 C++。

问候

这里放一个很简单的例子

wifstream file; 
file.open("C:\\appLog.txt", ios::in);

wchar_t buffer[2048]; 
file.seekg(2);
file.getline(buffer, bSize-1);

wprintf(L"%s\n", buffer);
file.close();

【问题讨论】:

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


    【解决方案1】:

    您可以使用fgetws,它读取 16 位字符。您的文件采用小端字节序。由于 x86 机器也是 little-endian,因此您应该能够轻松处理文件。当你想输出时,使用fwprintf

    另外,我同意更多信息可能会有用。例如,您可能正在使用一个抽象出其中一些内容的库。

    【讨论】:

    • 是的,您说的都是,更多信息可能会有用。我在 msdn,Jeffrey Richter 的书上试过,但在谈论这个主题时,他们似乎没有很好的例子。谢谢
    【解决方案2】:

    由于您很着急,请在二进制模式下使用 ifstream 并完成您的工作。我和你有同样的问题,这挽救了我的一天。 (这不是推荐的解决方案,当然,它只是一个 hack)

      ifstream file; 
      file.open("k:/test.txt", ifstream::in|ifstream::binary);
    
      wchar_t buffer[2048]; 
      file.seekg(2);
      file.read((char*)buffer, line_length);
      wprintf(L"%s\n", buffer);
      file.close();
    

    【讨论】:

    • 尼克这个答案真的帮助了我。 fgetws 需要一个大小的缓冲区。
    【解决方案3】:

    对于它的价值,我想我已经读过您必须使用允许您指定编码的 Microsoft 功能。

    http://msdn.microsoft.com/en-us/library/z5hh6ee9(VS.80).aspx

    【讨论】:

    • 这里不需要。
    【解决方案4】:

    FFFE 只是初始 BOM(字节顺序标记)。像往常一样从文件中读取,但读取到一个宽字符缓冲区。

    【讨论】:

    • 示例代码总是一个好主意——你怎么知道他通常是如何读取文件的?
    • 虽然我同意 Neil 的观点,但 Andres 确实说:“但我只是有使用纯 ascci 文件的经验。” ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    相关资源
    最近更新 更多