中文编码问题
由于历史原因,中文在计算机内编码有很多种,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;
}