一、注意事项
1.请注意汉字内码(对应字符为\xcc等)和打印出的转义字符(\\xcc)的区别!!!!该问题导致我们程序调试了差不多一整天!
2.另外库函数iconv会把传入的参数指针移位,这是正常的、请不要认为是自己程序有问题。
3.我的终端是utf-8格式,对于其他编码不能显示。
二、看看code
1.test.c
#include
#include
#include
int code_convert(char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open("UTF-8","GB2312");
if (cd==0)
return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen) == -1)
return -1;
iconv_close(cd);
return 0;
}
int main(){
char src[4096] = "\xcc\xb7\xbf\xad";
//注意:此处写为char src[4096] = "ccb7bfad";将不会被转换,因为系统认为是英文字母、而不是gbk的内码!
char dst[4096];
int srclen = 4096;
int dstlen = 4096;
int ret = code_convert(src,srclen,dst,dstlen);
printf("TK--------->>>>ret is %d\nsrc is %s\ndst is %s\n",ret,src,dst);
return 0;
}
2.gcc test.c -o test
3../test
TK--------->>>>ret is -1
src is ̷��
dst is 谭凯
三、iconv命令的正确使用
1.错误做法
vi input
\xcc\xb7\xbf\xad
iconv -f gb2312 -t utf-8 input >output
vi output
\xcc\xb7\xbf\xad
原因:在编程时\x是一个转义字符,可以说明\xcc只是一个十六进制的字符;但在文件中不可以这样做!
2.正确做法
vi input
谭凯
iconv -f gb2312 -t utf-8 input >output
vi output
Ì·¿
四、项目总结
当遇到底层上报有误,即:把"\xcc"上报成"\\xcc"时(前者包含一个字符‘\xcc’,后者包含4个字符'\\' ,'x','c','c')可以用提取后边两个字符,完后在添加的方法解决。
解决方法如下:
1.代码
#include
#include
#include
#include
long atox(char *s){
return strtol(s,NULL,16);
}
int main()
{
char a[17] = "\\xcc\\xb7\\xbf\\xad";
printf("a is %s\nstrlen(a) is %d\n",a,strlen(a));
a[4] = '\0';
a[8] = '\0';
a[12] = '\0' ;
if(a[0] == '\\'){
printf("atoi(&a[2]) is %d\n",atox(&a[2]));
printf("atoi(&a[6]) is %d\n",atox(&a[6]));
printf("atoi(&a[10]) is %d\n",atox(&a[10]));
printf("atoi(&a[14]) is %d\n",atox(&a[14]));
}
return 0;
}
2.gcc test.c -o test
./test
a is \xcc\xb7\xbf\xad
strlen(a) is 16
atoi(&a[2]) is 204
atoi(&a[6]) is 183
atoi(&a[10]) is 191
atoi(&a[14]) is 173