【问题标题】:Can't read some characters from UTF-8 file. Pure C无法从 UTF-8 文件中读取某些字符。纯C
【发布时间】:2015-05-20 12:20:44
【问题描述】:

我知道,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 文件:

并输出数据:

我不知道该怎么办。

【问题讨论】:

  • 也许你应该使用setlocale
  • 格式说明符%c 输出char,而不是wchar。使用%lc 输出wchar
  • @LeonardMichlmayr 尝试写 setlocale(LC_CTYPE, "")。它没有帮助。

标签: c encoding utf-8


【解决方案1】:

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

请注意,您在一开始就假设有一个 BOM。 UTF-8 文件不应该有 BOM,尽管一些 Windows 编辑器还是会添加 BOM。你应该小心这个问题。

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

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

【讨论】:

  • 实际上,您上面提到的链接中的代码也不起作用。它给出了相同的结果:英语 - 好的,俄语,西班牙语 - 不好。
  • 你检查过数据的十六进制输出吗?真的是 UTF-8 吗?
  • 不确定我是否理解如何执行此操作。我刚刚创建了文件(在 Windows 上)并用 UTF-8 保存(用户可以选择:unicode、ascii、utf-8)。
猜你喜欢
  • 2018-03-08
  • 2011-07-28
  • 2017-09-06
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多