处理C中的特殊字符(UTF-8编码)

我正在用C编写一个小应用程序来读取一个简单的文本文件,然后逐个输出这些行。 问题是文本文件包含特殊字符,如Æ,Ø和Å等。 当我在终端中运行程序时,这些字符的输出用“?”表示。

有一个简单的解决方案吗?

首先要做的事情:

  1. 读入缓冲区
  2. 使用libiconv或类似方法从UTF-8获取wchar_t类型并使用宽字符处理函数,如wprintf()
  3. 使用C中的宽字符函数! 大多数文件/输出处理函数都具有宽字符变体

确保您的终端可以处理UTF-8输出。 拥有正确的区域设置和操作区域设置数据可以为您自动执行很多文件打开和转换…取决于您正在做什么。

请记住 ,UTF-8中代码点或字符的宽度是可变的。 这意味着你不能只是寻找一个字节并开始像ASCII一样阅读…因为你可能落在代码点的中间。 在某些情况下,好的库可以做到这一点。

下面是一些代码(不是我的),演示了在C中使用UTF-8文件读取和宽字符处理的一些用法。

#include  #include  int main() { FILE *f = fopen("data.txt", "r, ccs=UTF-8"); if (!f) return 1; for (wint_t c; (c = fgetwc(f)) != WEOF;) printf("%04X\n", c); fclose(f); return 0; } 

链接

  1. libiconv的
  2. C / GNU libc中的区域设置数据
  3. 一些方便的信息
  4. C资源中另一个优秀的Unicode / UTF-8

确保你不小心丢弃任何字节; 一些UTF-8字符的长度超过一个字节(这就是重点),你需要保留它们。

将缓冲区的内容打印为hex可能很有用,因此您可以检查实际读取的字节:

 static void print_buffer(const char *buffer, size_t length) { size_t i; for(i = 0; i < length; i++) printf("%02x ", (unsigned int) buffer[i]); putchar('\n'); } 

您可以在加载一个包含几个字符的非常短的文件后执行此操作。

还要确保终端设置为正确的编码,因此它将您的字符解释为UTF-8。

可能你的文本文件是ISO-8559-1编码但你的终端是UTF-8。 在处理面向字节的文本处理时,这种不匹配是一个标准问题; 其他C程序(例如标准的’cat’和’more’命令)将执行相同的操作,通常不会将其视为错误或需要修复的内容。

如果你想在Unicode字符级别而不是字节上运行,那么你需要在整个程序中使用wchar作为你的字符类型而不是char,并为用户提供开关来指定传入的文件编码实际上是什么。 (虽然有时可以猜测,但它不是很可靠。)

我不知道它是否有用,但如果您确定终端和输入文件的编码是相同的,您可以尝试setlocale()

 #include  … setlocale(LC_CTYPE, "");