"Unicode" 是一个通用术语,您可能需要澄清您计划在文件中使用哪种 编码方式。
Unicode UTF-8 是常见的选择(它特别适用于在不同平台之间交换文本数据,因为它没有 "字节序" 的概念,与 UTF-16 不同,没有小端和大端的混淆,并且在互联网上被广泛使用),但也有其他选项(例如在 Windows 上的 UTF-16,可以直接映射到 Visual C++ 中的 wchar_t
-字符串)。
如果您正在使用 Visual C++,您可以在 fopen()
(或 _wfopen()
)的第二个参数中指定 ccs
属性,选择您想要的编码方式,例如 "ccs=UTF-8"
以使用 UTF-8 编码。
你可以在fopen()
MSDN 文档中了解更多细节,例如:
fopen
supports Unicode file streams. To open a Unicode file, pass a ccs
flag that specifies the desired encoding to fopen
, as
follows.
fp = fopen("newfile.txt", "rt+, ccs= encoding ")
Allowed values of encoding are UNICODE
, UTF-8
, and
UTF-16LE
.
我认为UNICODE
指的是UTF-16BE(即大端UTF-16);另外两个选项很清楚。
编辑
我尝试了这段代码,并且在使用Unicode UTF-8保存中文文本方面效果很好(我使用的是Visual Studio 2013):
wchar_t name[] = L"中國哲學書電子化計劃";
FILE * file = fopen("C:\\TEMP\\ChineseLetters.txt", "wt, ccs=UTF-8");
...check for error...
fwrite(name, sizeof(wchar_t), _countof(name)-1, file);
fclose(file);
请注意,在将中文文本粘贴到源文件并保存后,Visual Studio编辑器会自动判断需要将源文件保存为Unicode格式以避免丢失文本信息,并显示一个对话框请求确认。
因此,如果您的源文件中有一些“硬编码”的Unicode文本(在生产质量的Windows/C++代码中,您可能希望将文本保存在资源文件中),请
考虑将源文件保存为Unicode格式。
还要注意,我在fwrite()
调用中使用了_countof()
而不是sizeof()
。你原来是这样写的:
fwrite(name, sizeof(wchar_t), sizeof(name), file);
但是那是错误的,因为你想要在第三个参数中指定wchar_t
的数量,而不是总字节数(请注意,在MSVC中,sizeof(wchar_t) == 2
,即一个wchar_t
等于两个char
,即两个字节)。
此外,您需要考虑将-1
添加到wchar_t
的总缓冲区长度,因为您不希望在Unicode字符串缓冲区中写入NUL
-终止的wchar_t
。
(如果是未知静态大小的Unicode UTF-16 wchar_t
字符串,您可以直接使用wcslen()
获取不包括终止的NUL
的wchar_t
的数量)。
这是正确打开上面的UTF-8文件的方法:
frwite()
调用应该是:fwrite(name, sizeof(wchar_t), sizeof(name)/sizeof(wchar_t), pFile);
。 - Galikchar
而不是wchar_t
(假设我的修复已经完成),那么对我来说它可以正常工作。 - Galik