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)
\n\n\n我需要能够创建 Unicode 文本文件
\n
Unicode不是一种编码,你的意思是UTF-16LE吗?这是 Windows x86/x64 用于内存中内部字符串存储的两字节代码单元编码,某些 Windows 应用程序(如记事本)在其 UI 中将 UTF-16LE 误导性地描述为 \xe2\x80\x9cUnicode\xe2\x80\x9d 。
\n\n\n\n\nfwrite(名称, sizeof(wchar_t), sizeof(名称), pFile);
\n
您已将字符串的内存存储直接复制到文件中。如果您在 Windows/MSVCRT 下编译此文件,那么由于内部存储编码是 UTF-16LE,因此您生成的文件将编码为 UTF-16LE。如果你在其他环境中编译它,你会得到不同的结果。
\n\n\n\n\n这是我的“chineseLetters.txt”的输出: -NW\xc3\xb2Tx[\xc3\xb8f\xc3\xbb\xe2\x80\x93P[S\xc5\xa0\xc6\x92R \xc3\xb52123
\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"会使输出文件在记事本中显示得更好。
但最好将 s 转换wchar_t为char明确指定的特定所需编码(例如 UTF-8)的字节,而不是依赖于 C 库碰巧使用的内存存储格式。在 Win32 上,您可以使用WideCharToMultibyteAPI或ccs按照 Mr.C64 所描述的全开放方式来执行此操作。如果您选择用它编写 UTF-16LE 文件,ccs它将为您添加 BOM。
| 归档时间: |
|
| 查看次数: |
5583 次 |
| 最近记录: |