C ++文本文件不会保存为Unicode,而是一直保存为ANSI

Kel*_*elv 5 c++ unicode text file fwrite

因此,基本上,我需要能够以Unicode创建文本文件,但是我所做的任何事情都会保存在ANSI中。

这是我的代码:

    wchar_t name[] = L"???????????";
    FILE * pFile;
    pFile = fopen("chineseLetters.txt", "w");

    fwrite(name, sizeof(wchar_t), sizeof(name), pFile);
    fclose(pFile);
Run Code Online (Sandbox Code Playgroud)

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

     -NWòTx[øfû–P[SŠƒR  õ2123
Run Code Online (Sandbox Code Playgroud)

此外,该应用程序位于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);
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 4

\n

我需要能够创建 Unicode 文本文件

\n
\n\n

Unicode不是一种编码,你的意思是UTF-16LE吗?这是 Windows x86/x64 用于内存中内部字符串存储的两字节代码单元编码,某些 Windows 应用程序(如记事本)在其 UI 中将 UTF-16LE 误导性地描述为 \xe2\x80\x9cUnicode\xe2\x80\x9d 。

\n\n
\n

fwrite(名称, sizeof(wchar_t), sizeof(名称), pFile);

\n
\n\n

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

\n\n
\n

这是我的“chineseLetters.txt”的输出: -NW\xc3\xb2Tx[\xc3\xb8f\xc3\xbb\xe2\x80\x93P[S\xc5\xa0\xc6\x92R \xc3\xb52123

\n
\n\n

如果您将该文件误解为 Windows 代码页 1252(西欧),则 UTF-16LE 编码的数据将如下所示。

\n\n

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

\n\n

当你制作一个 UTF-16 文件时,你应该在它的开头放置一个字节顺序标记字符 U+FEFF,让消费者知道它是 UTF-16LE 还是 UTF-16BE。这也给像记事本这样的应用程序一个提示,表明该文件根本包含 UTF-16,而不是 ANSI。因此,您可能会发现写入L"\\uFEFF\xe2\x80\x8e\xe4\xb8\xad\xe5\x9c\x8b\xe5\x93\xb2\xe5\xad\xb8\xe6\x9b\xb8\xe9\x9b\xbb\xe5\xad\x90\xe5\x8c\x96\xe8\xa8\x88\xe5\x8a\x83"会使输出文件在记事本中显示得更好。

\n\n

但最好将 s 转换wchar_tchar明确指定的特定所需编码(例如 UTF-8)的字节,而不是依赖于 C 库碰巧使用的内存存储格式。在 Win32 上,您可以使用WideCharToMultibyteAPIccs按照 Mr.C64 所描述的全开放方式来执行此操作。如果您选择用它编写 UTF-16LE 文件,ccs它将为您添加 BOM。

\n