c语言汉字utf8,C语言汉字gbk转utf-8

一、注意事项

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值