【问题标题】:Unicode file functions using C++使用 C++ 的 Unicode 文件函数
【发布时间】:2012-11-16 17:21:52
【问题描述】:

我正在尝试读取 Unicode 文本文件并将读取的数据写回文本文件。这是代码。读取工作正常。我可以判断,因为它在控制台上显示了一个错误字符,但输出文本文件为空。任何帮助将不胜感激!

int main() {
    wchar_t *filename=L"normal.txt";
    FILE *infile;
    infile=_wfopen(filename,L"r");
    wchar_t  b[2];
    fwscanf(infile,L"%ls",b);
    wprintf(L"The string read was :%ls\n",b);//Read a character from the file
    FILE *outfile;
    wchar_t *filetwo = L"one.txt";
    outfile=_wfopen(filetwo,L"w, ccs=UTF-16LE");
    fwprintf(outfile,L"%ls",b);
    fclose(outfile);
    getch();
    return 0;
}

另外,我需要特别处理梵文脚本。它们占用多少字节?如果是 4,任何关于如何处理使用 wchar_t 的线索的线索,因为它只有 2 个字节宽。

【问题讨论】:

  • 另外,请注意 wchar_t 不能携带 Unicode 代码点值,因为在某些平台上它只有 16 位。
  • nitpick:“Unicode”没有指定二进制表示,所以你不能真正拥有这样的文本文件(好吧,除了一般的非特定限定符)。文件是否使用 UTF8、UTF16 或其他编码?
  • 您需要专门处理多字代码点,是的,要么使用 Unicode 库,要么自己编码和解码这些代理项。
  • @hyde 问题中的源代码是 UTF-16LE,也就是说,如果文本文件完全符合标准,则 BOM-less little-endian UTF-16。所以 Visual C++ 没有问题。
  • 梵文位于 BMP(基本多语言平面)中,它包含 U+0000 和 U+FFFF 之间的代码点。主要的梵文字符在 U+0900 到 U+097F 范围内;还有一个梵文扩展范围 U+A8E0 到 U+A8FF。所有这些在 2 字节 wchar_t 中都应该没问题。

标签: c++ visual-c++ unicode io


【解决方案1】:

梵文代码点都在 BMP 中(主块位于 U+0900,另外一些位于 U+A8F0),因此如果文本文件编码为 UTF-16,则所有字符仅占用一个 16 - 每个字。
(但不要以为情况总是如此。)

【讨论】:

    【解决方案2】:

    只回答第二个问题:

    梵文脚本字符在Basic Multilingual Plane 中。它们都是 16 位宽的,所以你在那里很安全。否则你将不得不与surrogate pairs混淆。

    【讨论】:

      【解决方案3】:

      找到解决办法!! 我只需要以二进制模式打开文件。否则,某些字符显然会被忽略。 非常感谢所有帮助的人!

      【讨论】:

      • ...什么?在文本模式下,系统换行符被转换为 C 换行符,这 kindof 看起来像是在忽略字符。您尝试读取的字符是值为 10 还是 13?
      • @MooingDuck 如果文件是 UTF-16,那么文件必须以二进制模式打开,因为您不希望,例如,从看起来像单个窄换行符的半个字符转换字符转换为 CRLF。此外,在 Windows 上还有一个特殊的字节模式,可用于指示文本文件的结尾,并且可以出现在 UTF-16 数据的中间。
      • @MooingDuck 例如,请参阅 C++11 标准 22.5/5 中的最后一个项目符号。
      • @bames53:哦,对了,忘了换行符会破坏非 ascii 兼容格式。
      猜你喜欢
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2011-04-06
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多