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

o01*_*o01 18 c macos terminal encoding utf-8

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

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

Aid*_*ell 28

首先要做的事情:

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

确保您的终端可以处理UTF-8输出.拥有正确的语言环境设置和操作语言环境数据可以为您自动执行大量文件打开和转换...取决于您正在做什么.

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

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

#include <stdio.h>
#include <wchar.h>
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;
}
Run Code Online (Sandbox Code Playgroud)

链接

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