免费注册 查看新帖 |

Chinaunix

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

[C++] 关于编码转换iconv_open("UTF-8", "GBK")失败 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-28 20:16 |只看该作者 |倒序浏览
10可用积分
各位大侠:

    今天碰到一个很郁闷的问题, 编译了一个libiconv, 但是运行程序每次到iconv_open就返回-1, 找不到原因,大家帮帮忙,看看。

具体函数类似与:

bool ConvertChar()
{

      iconv_t cd = iconv_open("UTF-8", "GBK");
      if(cd == (iconv_t)(-1))
      {
              printf("Failed");
      }
      else
      {
              printf("Success");
      }
       .....
}

我换了很多fromcode 和 tocode试都不行,所以应该可以排除:The conversion from fromcode to tocode is not supported by the implementation.
谢谢

今天又有新的发现, 当我在main函数里面也写了如下的代码时可以得到iconv_t的值不是-1
    iconv_t cd = iconv_open("UTF-8", "GBK");
      if(cd == (iconv_t)(-1))
      {
              printf("Failed");
      }
      else
      {
              printf("Success");
      }
但当在main函数里面调用ConvertChar()时, 又返回-1, 大家看看是什么问题?


[ 本帖最后由 PassionUranus 于 2008-7-31 13:05 编辑 ]

最佳答案

查看完整内容

这个库我以前也是有用,没这样的问题,觉得你可以检查下你的链接库,确认下链接的到底是哪个动态库,是不是所引用的头文件和动态库有差异,还是链接的系统原带的而不是你新编译的。只是推测。ldd 看下你的程序依赖的动态库

论坛徽章:
0
2 [报告]
发表于 2008-07-28 20:16 |只看该作者

回复 #1 PassionUranus 的帖子

这个库我以前也是有用,没这样的问题,觉得你可以检查下你的链接库,确认下链接的到底是哪个动态库,是不是所引用的头文件和动态库有差异,还是链接的系统原带的而不是你新编译的。只是推测。

ldd 看下你的程序依赖的动态库

论坛徽章:
0
3 [报告]
发表于 2008-07-28 20:55 |只看该作者
为什么你不在出错的时候perror看看呢?

论坛徽章:
0
4 [报告]
发表于 2008-07-28 21:34 |只看该作者
char * ConvertEnc( char *encFrom, char *encTo, const char * in)
{

        static char  bufout[1024], *sin, *sout;
        int  lenin, lenout, ret;
        iconv_t c_pt;

        if ((c_pt = iconv_open(encTo, encFrom)) == (iconv_t)-1)
        {
#ifdef _DEBUG_XML_
                printf("iconv_open false: %s ==> %s\n", encFrom, encTo);
#endif
                return NULL;
        }
        iconv(c_pt, NULL, NULL, NULL, NULL);
        lenin  = strlen(in) + 1;
        lenout = 1024;
        sin    = (char *)in;
        sout   = bufout;
        ret = iconv(c_pt, &sin, (size_t *)&lenin, &sout, (size_t *)&lenout);
        if (ret == -1)
        {
                return NULL;
        }
        iconv_close(c_pt);
        return bufout;

}

论坛徽章:
0
5 [报告]
发表于 2008-07-28 21:39 |只看该作者
原帖由 zhoubug 于 2008-7-28 20:35 发表
这个库我以前也是有用,没这样的问题,觉得你可以检查下你的链接库,确认下链接的到底是哪个动态库,是不是所引用的头文件和动态库有差异,还是链接的系统原带的而不是你新编译的。只是推测。

ldd 看下你的程 ...


呵呵,这个我当然是出错后第一个要check的事情, 调用的是我自己编译的库了.

论坛徽章:
0
6 [报告]
发表于 2008-07-28 21:55 |只看该作者
原帖由 mo_yuan_ming 于 2008-7-28 21:34 发表
char * ConvertEnc( char *encFrom, char *encTo, const char * in)
{

        static char  bufout[1024], *sin, *sout;
        int  lenin, lenout, ret;
        iconv_t c_pt;

        if ((c_pt = iconv_open(encTo, encFrom ...


这个代码写的确实很好, 而且我也是这样写的,但问题在于,我在if ((c_pt = iconv_open(encTo, encFrom)...的时候就返回了-1, 我无法再进行下一步.

论坛徽章:
0
7 [报告]
发表于 2008-07-29 09:40 |只看该作者
自己顶一下

论坛徽章:
0
8 [报告]
发表于 2008-07-29 13:00 |只看该作者
再顶,在线等

论坛徽章:
0
9 [报告]
发表于 2008-07-29 20:55 |只看该作者
再顶, 在线等

论坛徽章:
0
10 [报告]
发表于 2008-07-30 00:10 |只看该作者
以前分析过这个问题,跟楼主聊聊。
实际上iconv系列的函数还需要代码翻译文件的支持,就是from_to格式的文件,具体文件在什么地方跟操作系统有关,我知道sco和aix就不在同样的目录。你可以man iconv(就是iconv命令的帮助)看看,找到这个目录,然后查找有没有你需要的翻译文件,这个翻译文件说穿了就是一个数据字典,中间存放的是from格式的字符与to格式的字符的对应关系。如果没有,查查有没有通过其他编码能够搭桥的,我原来做的就是可以通过uucode将ISO-8859-2的转到gbk,但没有直接将ISO-8859-2转到gbk的。如果也没有,那么你只好看看能不能从网上下到这个文件了,或者给你的系统打补丁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP