无法使用fopen读取UTF8编码的文件(文件,“r,ccs = UTF-8”)

时间:2012-05-17 09:38:19

标签: c windows visual-studio fopen

我正在使用ccs = encoding(如MSDN中所述)在使用fopen打开文件时将编码设置为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 个答案:

答案 0 :(得分:2)

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

  

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

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

答案 1 :(得分:1)

试试这个

#include <locale.h>

setlocale(LC_ALL, "Japanese");

答案 2 :(得分:0)

请参阅fgets,fgetws

  

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

如果您尝试“rb”。

答案 3 :(得分:0)

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

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