免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7199 | 回复: 10
打印 上一主题 下一主题

使用iconv函数修改字符集出错,大家帮看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-22 16:44 |只看该作者 |倒序浏览
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
        iconv_t cd;
        int rc;
        char **pin = &inbuf;
        char **pout = &outbuf;
        
        cd = iconv_open(to_charset,from_charset);
        if (cd==0) return -1;
        memset(outbuf,0,outlen);
        if (iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen)==-1)
                                return -1;
        iconv_close(cd);
        return 0;

}



int main()
{
        char out[400];
        char str_str[400];
        unsigned short test[400];
        wchar_t wcode[400];
        
        unsigned int inlen;
        unsigned int outlen=200;

        int result;
        string str = "汉";

        memset(str_str,0,sizeof(str_str));
        memcpy(str_str,str.c_str(),strlen(str.c_str()));
        inlen=strlen(str_str);
  
        result=code_convert("usc2","gb18030",str_str,inlen,out,OUTLEN);

  printf("result = %d\n",result);
  
}



我照着网上的范例写了这个程序,想把GB18030的中文字符集转换成USC2的字符集,但是一直都不成功,每次执行的result结果都是-1,大家帮忙看看是什么原因

[ 本帖最后由 封神 于 2008-12-23 17:25 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-22 17:04 |只看该作者
iconv_open出错返回(iconv_t)(-1)

论坛徽章:
0
3 [报告]
发表于 2008-12-22 17:12 |只看该作者
我是这里出错返回:

if (iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen)==-1)
        return -1;

论坛徽章:
0
4 [报告]
发表于 2008-12-22 17:15 |只看该作者
"result=code_convert("UTF8","GB18030",str_str,inlen,out,OUTLEN);"

“妹子执行的result结果都是-1”

看看你给inlen 传的值大妹子
你是每次还是妹子

ps:strlen(str.c_str())这个地方的用法也有问题的吧

[ 本帖最后由 zhoubug 于 2008-12-22 17:18 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-12-22 17:30 |只看该作者
ps:strlen(str.c_str())这个地方的用法也有问题的吧


我一直都这么用啊,得到的长度也没错。虽然是在"result=code_convert("UTF8","GB18030",str_str,inlen,out,OUTLEN);"调用的字符集转换函数,但是执行到if (iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen)==-1) 这里时才会返回 -1

论坛徽章:
0
6 [报告]
发表于 2008-12-22 17:38 |只看该作者
你的inlen没有初始化值,0或者你需要转换的buf长度

论坛徽章:
0
7 [报告]
发表于 2008-12-22 17:41 |只看该作者
原帖由 封神 于 2008-12-22 17:30 发表
ps:strlen(str.c_str())这个地方的用法也有问题的吧


我一直都这么用啊,得到的长度也没错。虽然是在"result=code_convert("UTF8","GB18030",str_str,inlen,out,OUTLEN);"调用的字符集转换函数,但是执行到 ...

那是你走点小运而已

论坛徽章:
0
8 [报告]
发表于 2008-12-23 14:22 |只看该作者
原帖由 zhoubug 于 2008-12-22 17:38 发表
你的inlen没有初始化值,0或者你需要转换的buf长度



源程序有加的,拷贝过来的时候漏掉了。

问题已经解决了一半,原来iconv转码的时候是区分大小写的.......我把编码格式改成"ucs2"和"gb18030"就通过了,不过在别的程序里面调用这个函数的时候,会报bus error,用gdb跟了一下,发现报下面的错误:

Program received signal SIGBUS, Bus error
  si_code: 1 - BUS_ADRALN - Invalid address alignment. Please refer to the following link that helps in handling unaligned data: http://docs.hp.com/en/7730/newhe ... tm#pragma-pack-ex3.
[Switching to thread 2 (system thread 1754571)]
0x9fffffff7bbf7900:0 in <unknown_procedure> + 0xf90 ()
   from /usr/lib/nls/iconv/hpux64/methods.1/lucs2gb18030.so

这个问题怎么解决?

论坛徽章:
0
9 [报告]
发表于 2008-12-23 15:18 |只看该作者
汗, 你代码中不是将UTF8转换为GB18030么?

ucs2和UTF8根本就不是一个概念, 别乱用.

你的源代码是什么编码, "汉"就是什么编码.

论坛徽章:
0
10 [报告]
发表于 2008-12-23 17:24 |只看该作者
最终要求是gb18030转成UCS2,‘汉’字是从数据库取出来的16GBK编码,不过我在iconv支持的编码库中没看到16GBK,就用了16GBK之前的gb18030
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP