无法从 UTF-8 文件中读取某些字符。纯C
Can't read some characters from UTF-8 file. Pure C
我知道,Whosebug 上有几个类似的主题,但我还没有找到解决我的问题的方法。
我尝试读取 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
文件:
并输出数据:
我不知道该怎么办。
fgetwc()
returns一个wchar
(一个"wide character")。这与 UTF-8 不同。 wchar
是一些固定大小(通常是 16 位)。 UTF-8 字符的长度在 1 到 4 个字节之间是可变的,需要一些特殊的解析。对于非常简单的工作,Reading Unicode (UTF-8) in C is useful. If you need more complex work, then see ICU.
请注意,您一开始就假设有 BOM。 UTF-8 文件不应该有 BOM,尽管一些 Windows 编辑者无论如何都会添加一个。你应该小心这个问题。
如果您所做的只是从一个流读取并写入另一个流,那么当然没有必要担心 UTF-8。您可以将它们视为原始字节。但是如果你要解释它们,那么你将需要正确解码 UTF-8。
也就是说,您还应该确认您确实拥有 UTF-8 文件。例如,在 Windows 上,文件以各种代码页或 UTF-16 编写是很常见的(UTF-16 是一种应该具有 BOM 的文件)。我几乎总是发现在十六进制编辑器中查看文件以确保字节与您认为的一样有用。
我知道,Whosebug 上有几个类似的主题,但我还没有找到解决我的问题的方法。 我尝试读取 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
文件:
并输出数据:
我不知道该怎么办。
fgetwc()
returns一个wchar
(一个"wide character")。这与 UTF-8 不同。 wchar
是一些固定大小(通常是 16 位)。 UTF-8 字符的长度在 1 到 4 个字节之间是可变的,需要一些特殊的解析。对于非常简单的工作,Reading Unicode (UTF-8) in C is useful. If you need more complex work, then see ICU.
请注意,您一开始就假设有 BOM。 UTF-8 文件不应该有 BOM,尽管一些 Windows 编辑者无论如何都会添加一个。你应该小心这个问题。
如果您所做的只是从一个流读取并写入另一个流,那么当然没有必要担心 UTF-8。您可以将它们视为原始字节。但是如果你要解释它们,那么你将需要正确解码 UTF-8。
也就是说,您还应该确认您确实拥有 UTF-8 文件。例如,在 Windows 上,文件以各种代码页或 UTF-16 编写是很常见的(UTF-16 是一种应该具有 BOM 的文件)。我几乎总是发现在十六进制编辑器中查看文件以确保字节与您认为的一样有用。