请教,在64位机AIX系统,使用iconv()函数转换UTF-8到GBK失败,是什么原因呢?如何解决?

hongming1129 2010-04-20 01:14:20
请教,在64位机AIX系统,使用iconv()函数转换UTF-8到GBK失败,是什么原因呢?如何解决?
...全文
994 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rain820804 2011-01-21
  • 打赏
  • 举报
回复
怎么看不了回复
hongming1129 2010-04-21
  • 打赏
  • 举报
回复
散分啦
hongming1129 2010-04-21
  • 打赏
  • 举报
回复
谢谢楼上的提醒。
检查了一下,果然是传入的参数不兼容。
调用iconv(cd, &inbuf, inlen, outbuf, outlen),传入的参数inlen、outlen均在前面定义成了int型。正确的定义应该是long、unsigned long、size_t。
修改数据定义语句为:
size_t inlen, outlen;
函数原型:
size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
size_t类型在sys/types.h中的定义:
typedef unsigned long size_t;
在旧的C语言库中,size_t类型在sys/types.h中的定义:
typedef unsigned int size_t;
习惯了,直接就在前面定义了int inlen, outlen。
良好的习惯应该使用库中定义的数据类型。或者应该要了解库中定义的基本数据类型。至少在出现这种问题的时候,会从这个角度着手解决。

再次感谢!
tufei1129 2010-04-21
  • 打赏
  • 举报
回复
perror("iconv"),结果是“invalid wide charactor”。
在调用iconv()时,字长不够,可能传入的参数类型不兼容。尤其时在64位机上,long的字长是8,int的字长是4;在32位机上long的字长是4,int的字长也是4。在32位机上,int、long是可以通用的,在64位机上,用long的地方,传了int的数据做参数就会报“invalid wide charactor”,字长不够。
检查下传入的参数是否符合。
hongming1129 2010-04-20
  • 打赏
  • 举报
回复
perror("iconv"),结果是“invalid wide charactor”。
hongming1129 2010-04-20
  • 打赏
  • 举报
回复
说明下,我使用的是系统自带的库。并未自己加装一个libiconv。
ivonc_open()调用正常,但是在调用iconv时返回-1。
mymtom 2010-04-20
  • 打赏
  • 举报
回复
楼主, 上代码!

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧