4

使用 fopen 打开文件时,我使用 ccs=encoding(如MSDN中所述)将编码设置为 UTF-8。

写入文件时它工作正常

wchar_t* unicode_text = L"こんにちは";
FILE* f = fopen("C:\\test.txt", "w,ccs=UTF-8");
fwprintf(f, L"%s\n", unicode_text);
fclose(f);

当我在文本编辑器中打开文件时,unicode 会按原样显示。但是当尝试从创建的文件中读取时,未检测到 UTF-8 编码:

wchar_t buffer[1000];
FILE* f = fopen("C:\\test.txt", "r,ccs=UTF-8");
fgetws(buffer, 1000, f);
fclose(f);

MessageBoxW(0, buffer, 0, 0);

这将在消息框中显示“ããã«ã¡ã¯”。

为什么会这样?ccs=UTF-8 仅在打开文件进行写入时有效吗?

4

4 回答 4

2

该文档暗示 UTF-8 编码仅可用于写作(强调我的):

在 Visual C++ 2005 中,fopen 支持 Unicode 文件流。在打开新文件覆盖现有文件时,可以将指定所需编码的标志传递给 fopen ,如下所示:

请注意,“读取现有文件”明显不存在。

于 2012-05-17T15:51:17.890 回答
2

尝试这个

#include <locale.h>

setlocale(LC_ALL, "Japanese");
于 2012-05-17T11:13:56.990 回答
0

参见fgets,fgetws

fgetws 根据流是以文本模式还是二进制模式打开,将宽字符参数 str 读取为多字节字符串或宽字符串,

如果你尝试“rb”。

于 2012-05-17T15:06:09.380 回答
0

这可能就像从文本中剥离 BOM 一样简单。看起来您的文本框中显示的前三个字符(“”)是 UTF-8 文件的 BOM:

http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

于 2012-11-16T19:31:33.513 回答