关于gb,ascii混合编码到ucs-2编码互相转换的问题
我最近接手一个短信平台的项目,现在已经到了差不多完工的日期,但有个问题还是没有解决,就是编码的问题, 从移动网关发过来的信息基本上都是ucs2编码格式的,我们内部业务处理模块都是用的一般的ascii+gb混合编码,我现在不能够识别从网关发过来的信息内容, 还有个问题是,由于信息量比较大,MT也就是发给网关的信息需要按140字节来截断,但是我发现如果内容既有汉字有又ascii的时候发送到手机上就会丢字,这是因为,我用strlen测量的时候ascii按一个字节算,而发到网关上面,网关把ascii也算成2个字节,所以出现丢字,我试着用了iconv库,可是发现并不好用,解析出来的都是乱的,而且在unicode-gb的时候根本解析不出来。请问谁有现成的程序或者好的办法,多谢啦,叫不了公就会不了家,实在是不想在这里呆着了
附上,我的测试转换的代码,用的iconv,可是不起作用
int main(int argc, char **argv)
{
FILE *fin, *fout;
char *encFrom, *encTo;
char bufin[1024], bufout[1024], *sin, *sout;
int mode, lenin, lenout, ret, nline;
iconv_t c_pt;
if (argc != 5) {
printf("Usage: a.out <encFrom> <encTo> <fin> <fout>\n");
return 0;
}
encFrom = argv[1];
encTo = argv[2];
if ((fin = fopen(argv[3], "rt")) == NULL) {
printf("Cannot open file: %s\n", argv[3]);
return -1;
}
if ((fout = fopen(argv[4], "wt")) == NULL) {
printf("Cannot open file: %s\n", argv[4]);
return -1;
}
if ((c_pt = iconv_open(encTo, encFrom)) == (iconv_t)-1) {
printf("iconv_open false: %s ==> %s\n", encFrom, encTo);
return -1;
}
iconv(c_pt, NULL, NULL, NULL, NULL);
nline = 0;
while (fgets(bufin, 1024, fin) != NULL) {
nline ++;
lenin = strlen(bufin) + 1;
lenout = 1024;
sin = bufin;
sout = bufout;
ret = iconv(c_pt, &sin, (size_t * )&lenin, &sout, (size_t *)&lenout);
printf("%s -> %s: %d: ret=%d, len_in=%d, len_out=%d\n",
encFrom, encTo, nline, ret, lenin, lenout);
if (ret == -1) {
printf("stop at: %s\n", sin);
break;
}
fprintf(fout, "%s", bufout);
}
iconv_close(c_pt);
fclose(fin);
fclose(fout);
return 0;
}