为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨魅力 2019-04-08 11:16:49
我的需求是从utf-8文件读入到内存,然后想遍历它来寻找某个特殊字符。我的代码片段://检查utf-8字符所占字节数#defineUTF8_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);intstep=0;for(;*(buf+step)!='\0';++step){intutf8_word_len=UTF8_CHAR_LEN(buf+step);//utf8是多字节的,我也确定了编码是utf-8所以不需要判断是否是其他的编码了if(utf8_word_len>1){charword[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的字符哦,不是想做编码转换的.
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

使用glib的utf8相关函数,或者转成wchar。或者拿iconv把编码转成utf32然后用uint32_t表示字符也成。
                            
查看完整回答
反对 回复 2019-04-08
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

加入文件是utf-8编码,内容如下:
我是来自上海的互联网程序员,主要从事Web/游戏/手机服务器开发.
下面C代码可以一个一个的读入这些中文字符():
#defineUTF8_CHAR_LEN(byte)(((0xE5000000>>((byte>>3)&0x1e))&3)+1)
charcontent[255];//一行一行的读入文件,255的话大概满足需求了;这个代码片段也只是测试用.
FILE*data_file=fopen("path/to/file","r");
if(!data_file){
fprintf(stderr,"errorhappenedwhenreadfile:%s","path/to/file");
return-1;
}
fgets(content,255,data_file);
inti;
for(i=0;content[i]!='\0';i++){
intutf8_char_len=UTF8_CHAR_LEN(content[i]);
if(utf8_char_len>1){
charword[4];//utf-8占位最大字节也就是4个字节
memcpy(word,(content+i),utf8_char_len);
i+=utf8_char_len-1;
printf("%s\t",word);
}
else{
printf("%c\t",content[i]);
}
}
fclose(data_file);
输入:
我是来自上海的互联网程序员,主要从事Web/游戏/手机服务器开发.
这里我觉得主要问题是字符指针它不标识出编码字符的大小,如果单纯的用(p+1)的话会把编码混乱掉,所以要先判断字符编码的所占字节数,然后再(p+sizeofword)输出;
上面的代码满足我现在的需求,不过还有一些疑问;
utf-8编码的字符在Linuxc下面怎么处理的呢?一般模式我还在寻找,有机会帖在这里.
这里还帖一个用宽字符库遍历utf-8字符串的代码片段:
wchar_twstr[]=L"你好";
//en_US.UTF-8是我本地的locale
setlocale(LC_ALL,"en_US.UTF-8");
inti;
for(i=9;iwprintf(L"%lc\n",wstr[i]);
}
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 843 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信