gpt4 book ai didi

C++ 文本文件不会保存在 Unicode 中,它一直保存在 ANSI 中

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:45 24 4
gpt4 key购买 nike

所以基本上,我需要能够以 Unicode 创建一个文本文件,但无论我做什么,它都会以 ANSI 格式保存。

这是我的代码:

    wchar_t name[] = L"‎中國哲學書電子化計劃";
FILE * pFile;
pFile = fopen("chineseLetters.txt", "w");

fwrite(name, sizeof(wchar_t), sizeof(name), pFile);
fclose(pFile);

这是我的“chineseLetters.txt”的输出:

     -NWòTx[øfû–P[SŠƒR  õ2123

此外,应用程序是 MBCS 格式,不能更改为 Unicode,因为它需要同时使用 Unicode 和 ANSI。

我真的很感激这里的一些帮助。谢谢。

感谢大家的快速回复!有用!

简单地添加 L"\uFFFE 中国哲学书籍电子化计划"仍然没有用,文本编辑器仍然将其识别为 CP1252 所以我做了 2 个 fwrite 而不是一个,一个用于 BOM,一个用于字符,现在是我的代码:

    wchar_t name[] = L"‎中國哲學書電子化計劃";
unsigned char bom[] = { 0xFF, 0xFE };
FILE * pFile;
pFile = fopen("chineseLetters.txt", "w");
fwrite(bom, sizeof(unsigned char), sizeof(bom), pFile);
fwrite(name, sizeof(wchar_t), wcslen(name), pFile);
fclose(pFile);

最佳答案

I need to be able to create a text file in Unicode

Unicode 不是一种编码,你是说 UTF-16LE 吗?这是 Windows x86/x64 用于内存中内部字符串存储的双字节代码单元编码,一些 Windows 应用程序(如记事本)在其 UI 中误将 UTF-16LE 描述为“Unicode”。

fwrite(name, sizeof(wchar_t), sizeof(name), pFile);

您已将字符串的内存存储直接复制到文件中。如果你在 Windows/MSVCRT 下编译它,那么因为内部存储编码是 UTF-16LE,所以你生成的文件被编码为 UTF-16LE。如果您在其他环境中编译它,您将得到不同的结果。

And here is the output of my "chineseLetters.txt": -NWòTx[øfû–P[SŠƒR õ2123

如果您将文件误解为 Windows 代码页 1252(西欧),UTF-16LE 编码的数据就是这个样子。

如果您已将文件加载到记事本等 Windows 应用程序中,它可能不知道该文件包含 UTF-16LE 编码数据,因此默认使用您的默认区域设置(ANSI, mbcs) 代码页作为编码,导致上面的mojibake .

当你制作一个 UTF-16 文件时,你应该在它的开头放置一个字节顺序标记字符 U+FEFF,让用户知道它是 UTF-16LE 还是 UTF-16BE。这也给像记事本这样的应用程序提示文件包含 UTF-16,而不是 ANSI。因此,您可能会发现编写 L"\uFEFF 中国哲学书电子化计划" 会使输出文件在记事本中显示得更好。

但最好将 wchar_t 转换成 char 字节,采用明确规定的特定所需编码(例如 UTF-8),而不是依赖于 - C 库碰巧使用的内存存储格式。在 Win32 上,您可以使用 WideCharToMultibyte API 执行此操作,或使用 Mr.C64 所描述的完全开放的 ccs。如果您选择使用 ccs 编写 UTF-16LE 文件,它将为您放入 BOM。

关于C++ 文本文件不会保存在 Unicode 中,它一直保存在 ANSI 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28055802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com