首先在ubuntu环境测试一下汉字的编码类型
/*test1.c*/
#include <stdio.h>
#include <string.h>
int main(void)
{
unsigned char arr[] = "余";
unsigned int len, i;
len = strlen(arr);
printf("length: %d byte\n",len);
printf("code : ");
for(i=0;i<len;i++)
{
printf("%X",arr[i]);
}
printf("\n");
return 0;
}
/*输出结果*/
length: 3 byte
code : E4BD99
通过查询”余“的各类编码形式:
可知ubuntu是以UTF-8的编码方式存储汉字的。
下面尝试一下转换成GB2312编码。
UTF-8转GB2312
/*test2.c*/
#include <stdio.h>
#include <iconv.h>
#include <string.h>
int changeCode(char *, int, char *,int);
iconv_t code;
int main(void)
{
unsigned char used[] = "余";
unsigned char new[10];
unsigned int len_used, len_new, len_dest, k;
unsigned int i = 0;
len_used = strlen(used);
len_new = sizeof(new);
memset(new, 0, len_new);
code = iconv_open("gb2312","utf-8");
len_dest = len_new - changeCode(new,len_new,used,len_used);
while(len_dest--)
{
printf("%X",new[i++]);
}
printf("\n");
return 0 ;
}
int changeCode(char *destbuf, int destlen, char *srcbuf, int srclen)
{
size_t inlen;
size_t outlen;
char **inbuf, **outbuf;
inlen = srclen;
outlen = destlen;
inbuf = &srcbuf;
outbuf = &destbuf;
iconv(code, inbuf, &inlen, outbuf, &outlen);
return outlen;
}
/*输出结果*/
D3E0
其中返回的outlen为转换后剩余的空间,那么使用
len_dest = len_new - changeCode(new,len_new,used,len_used);
语句就可以得到转换后有多少个字节了。
用一个小软件验证一下结果:
OK,先写这么多…