rain_fish 发表于 2010-11-29 14:22

再请教一个问题,关于iconv的,返回失败,但转换成功了,不知道原因。

下面是代码,转化成功了,但iconv返回-1,errno为84,errno.84 is: Invalid or incomplete multibyte or wide character
不知道原因,请高手指点。#include <iconv.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#define OUTLEN 255
//代码转换:从一种编码转为另一种编码
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;
}
//UNICODE码转为GB2312码
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}

main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out;

//unicode码转为gb2312码
int rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("rc:%d, errno:%d, unicode-->gb2312 out=%sn",rc,errno, out);
//gb2312码转为unicode码
rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("rc:%d, errno:%d, gb2312-->unicode out=%sn",rc,errno,out);
}

lj56630325 发表于 2010-11-29 15:11

本帖最后由 lj56630325 于 2010-11-29 15:13 编辑

export info in bash:
declare -x LANG="zh_CN.utf8"
declare -x LC_ALL=""
declare -x LC_CTYPE="zh_CN.utf8"
我的main, 其他一样.
main()
{
    char *in_utf8 = "正在安装"; //
    char out;
    char out_gb2312;

    //unicode码转为gb2312码
    int rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
    printf("rc:%d, errno:%d, unicode-->gb2312 out=%s\n",rc,errno, out);                                             
    //gb2312码转为unicode码
    rc = g2u(out,strlen(out),out_gb2312,OUTLEN);
    printf("rc:%d, errno:%d, gb2312-->unicode out=%s\n",rc,errno,out_gb2312);                                       
}

lj56630325 发表于 2010-11-29 15:13

输出
rc:0, errno:0, unicode-->gb2312 out=
rc:0, errno:0, gb2312-->unicode out=正在安装
可能你的"正在安装"不是gb2312

rain_fish 发表于 2010-11-29 16:11

输出可能你的"正在安装"不是gb2312
lj56630325 发表于 2010-11-29 15:13 http://bbs.chinaunix.net/images/common/back.gif


    非常感谢您的回答,我按照您的代码试了一下还是不行:
rc:-1, errno:84, unicode-->gb2312 out=���ڰ�װ
rc:-1, errno:84, gb2312-->unicode out=正在安装
通过gdb,发现第一行输出地确实是gbk编码,我的终端是utf8编码的,所以第二行可以看到。
而且文件格式我是通过iconv改变成utf8的,
$ file 4.c
4.c: UTF-8 Unicode C program text

也是utf8,输出还是有问题,请再次指教。。。。

rain_fish 发表于 2010-11-29 16:32

输出可能你的"正在安装"不是gb2312
lj56630325 发表于 2010-11-29 15:13 http://bbs.chinaunix.net/images/common/back.gif


    您好,您运行的代码就是我放在上面的代码吗?

rain_fish 发表于 2010-11-29 16:46

关键是虽然返回成功,但是却转换成功了。。。,很是纳闷。。。

lj56630325 发表于 2010-11-29 17:29

回复 5# rain_fish
1) 我用的代码是2楼贴的代码.

2) 我确定的是我程序中的"正在安装"是UTF8的. (我的BASH是UTF8的, 我手动输入的"正在安装")

3) 你应该检测你程序的字符是什么编码的. 这个跟文件(4.c: UTF-8 Unicode C program text)是UTF8有没有关系, 我不清楚.

zylthinking 发表于 2010-11-30 12:29

关键是虽然返回成功,但是却转换成功了。。。,很是纳闷。。。
rain_fish 发表于 2010-11-29 16:46 http://bbs.chinaunix.net/images/common/back.gif


很可能是你的多字节字符串最后一个字符是不完整的,所谓转换成功, 大概是之前的转换成功了, 而后面跟着错误不可见的半个字符

rain_fish 发表于 2010-11-30 13:44

很可能是你的多字节字符串最后一个字符是不完整的,所谓转换成功, 大概是之前的转换成功了, 而后面 ...
zylthinking 发表于 2010-11-30 12:29 http://bbs.chinaunix.net/images/common/back.gif


    我确定后没有不完整的字符,很是纳闷,刚才在虚拟机上测试了一下,竟然成功。不知道是什么原因了

zylthinking 发表于 2010-11-30 15:44

我确定后没有不完整的字符,很是纳闷,刚才在虚拟机上测试了一下,竟然成功。不知道是什么原因了
rain_fish 发表于 2010-11-30 13:44 http://bbs.chinaunix.net/images/common/back.gif


淡定, 淡定。。。。。。。。{:3_189:}
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 再请教一个问题,关于iconv的,返回失败,但转换成功了,不知道原因。