开发者社区> 问答> 正文

linux C 语言如何遍历 utf-8字符

我的需求是从utf-8文件读入到内存,然后想遍历它来寻找某个特殊字符。

我的代码片段:

// 检查utf-8字符所占字节数
#define UTF8_CHAR_LEN( byte ) ((( 0xE5000000 >> (( byte >> 3 ) & 0x1e )) & 3 ) + 1)
FILE *fp = fopen(PATH_TO_FILE, "r");

char *buf = malloc(LENGTH_OF_FILE * sizeof(char));

fgets(buf, LENGTH_OF_FILE, fp);

int step = 0;
for (; *(buf + step) != '\0'; ++step) {
  int utf8_word_len = UTF8_CHAR_LEN(buf + step);
  // utf8是多字节的,我也确定了编码是utf-8 所以不需要判断是否是其他的编码了
  if (utf8_word_len > 1) {
    char word[utf8_word_len];
    strncpy(word, (buf+step), urf8_word_len);
    step += urf8_word_len;
    // 这里就可以输出中文了,但是很奇怪啊,输出中文字符后还有一个很奇怪的字符
    // 肯定是我哪里搞错了,还请高手指点.
    printf("%s\n", word);
  }
  else {
    printf("%c\n", buf + step);
  }
}
fclose(fp);
free(buf);

问题是,当文件遇到utf-8编码的中文,这段代码就输出乱码了。我知道%c 是输出一个字节的内容,utf-8里面中文可能需要3个字节,所以有乱码会;但是自己不知道怎么处理 utf-8字符的遍历。

求高手解答.

PS: 我是想从字符指针去遍历utf-8的字符哦,不是想做编码转换的.

展开
收起
a123456678 2016-06-06 10:29:30 2401 0
1 条回答
写回答
取消 提交回答
  • 使用 glib 的 utf8 相关函数,或者转成 wchar。或者拿 iconv 把编码转成 utf32 然后用 uint32_t 表示字符也成。

    2019-07-17 19:27:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载