无法从UTF-8文件中读取某些字符。纯净的C.

时间:2015-03-17 21:12:44

标签: c encoding utf-8

我知道,stackoverflow上有几个类似的主题,但我还没有找到解决我的问题的方法。 我尝试读取UTF-8文件。英文字母一切都好,但我看不懂俄文或西班牙文字。 这是我的代码。举个例子。

FILE * fp;
char line[3];
fp = fopen("letters.data", "r");
if (fp == NULL)
    return;
int i=0;

fread(line,1,3, fp); // BOM
wint_t w;
while( w = fgetwc(fp) )
{
    wprintf(L"%c", w);
}
fclose(fp);

这是letters.data档案:

enter image description here

输出数据:

enter image description here

我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

fgetwc()返回wchar(“宽字符”)。这与UTF-8不同。 wchar是一些固定大小(通常是16位)。 UTF-8字符的长度在1到4个字节之间,需要一些特殊的解析。对于非常简单的工作,Reading Unicode (UTF-8) in C很有用。如果您需要更复杂的工作,请参阅ICU

请注意,您在开始时假设有BOM。 UTF-8文件不应该有BOM,但有些Windows编辑器仍然添加一个。你应该小心这个问题。

如果你所做的只是从一个流中读取并写入另一个流,那么就不必担心UTF-8了。您可以将它们视为原始字节。但如果您要解释它们,那么您将需要正确解码UTF-8。

也就是说,您还应该验证您确实拥有UTF-8文件。例如,在Windows上,将文件写入各种代码页或UTF-16(UTF-16是应该具有BOM的文件类型)是很常见的。我几乎总是发现在十六进制编辑器中查看文件是有用的,以确保字节符合您的想法。