中文编码问题

标签:中文   GBK   UTF8    1919人阅读 评论(0)
分类:

由于历史原因,中文在计算机内编码有很多种,GB2312, GBK, GB18030, UTF8......等等,


现在linux系统及一些数据库,基本都默认是UTF8编码,如果不符合,显示就是乱码,或者入库不成功。

最近调试某项目,需要扫描中文,写中文日志,保存中文文件,各种问题!!

C语言处理中文,会让人抓狂!! 


理论上其实可以从源头知道某段文字的编码格式,再调用iconv()函数转码,

但实际很多时候只能靠猜,于是就诞生了一堆库,用来猜测一段字符是什么编码格式,

我用过几个,貌似都有不准的。



于是乎, 决定自己动手,丰衣足食,猜测是否UTF8编码的代码贴上:


/*

根据UTF8规范, 检测所有字符是否都符合UTF8编码标准.

目前常见的中文字符是E4 - E9开头, 其他编码即便符合UTF8规范, 可能也是非中文字符或者图形图像符号, 也算非法.

return value:

1: 是UTF8

0: 不是UTF8

*/

int verify_if_utf8(const char *string, int str_len)

{

int i, j, step_len;

const unsigned char *short_ptr = (const unsigned char *)string;


for(i = 0; i < str_len; i += step_len){

if(0 == (short_ptr[i] & 0x80)){

step_len = 1; /* 最高位是0, 单字节, ascii码 */

}else{

switch(short_ptr[i] & 0xFF){

case 0xE4:

case 0xE5:

case 0xE6:

case 0xE7:

case 0xE8:

case 0xE9: /* 常见汉字编码区 */

if(((short_ptr[i+1] & 0xC0) == 0x80)  && ((short_ptr[i+2] & 0xC0) == 0x80)){  /* 最高两位是10 */

step_len = 3; 

}else{

return 0;

}

break;

default:

return 0;

}

}

}


return 1;

}


查看评论

暂无评论

发表评论
  • 评论内容:
      
首页
团队介绍
发展历史
组织结构
MESA大事记
新闻中心
通知
组内动态
科研成果
专利
论文
项目
获奖
软著
人才培养
MESA毕业生
MESA在读生
MESA员工
招贤纳士
走进MESA
学长分享
招聘通知
招生宣传
知识库
文章
地址:北京市朝阳区华严北里甲22号楼五层 | 邮编:100029
邮箱:nelist@iie.ac.cn
京ICP备15019404号-1