我的需求是从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的字符哦,不是想做编码转换的.
使用 glib 的 utf8 相关函数,或者转成 wchar。或者拿 iconv 把编码转成 utf32 然后用 uint32_t 表示字符也成。