iconv转码问题

乞丐的生鱼片 2014-06-24 10:21:31
我uncide转换为gbk。
我的红帽测试机可以转换,将unicode能转换为utf-8,gbk。
我用我的红帽静态编译后,放在debian下。
转utf-8的可以,转gbk就遇到问题。转gbk时,连返回码都没有,程序直接从inconv函数跳出了。为什么,求大神解答
附转换代码:
ssize_t convert(const char *tocode, const char *fromcode, char *inbufp, size_t inbytesleft, char *outbufp, size_t outbytesleft)
{
iconv_t ic;
size_t outbytes = outbytesleft;
int ret;
ic = iconv_open (tocode, fromcode);
if (ic == (iconv_t ) - 1)
{
printf ("iconv_open failed: from: %s, to: %s: %s\n", fromcode, tocode, strerror (errno));
return -1;
}
while (inbytesleft > 0)
{
ret = iconv (ic, &inbufp, &inbytesleft, &outbufp, &outbytes); if (ret == -1)
{
printf ("iconv failed: from: %s, to: %s: %s\n", fromcode, tocode, strerror (errno)); return -1;
}
}
ret = iconv_close (ic);
if (ret == -1)
{
printf ("iconv_close failed: from: %s, to: %s: %s\n", fromcode, tocode, strerror (errno));
return -1;
}
return outbytesleft-outbytes;
}

...全文
406 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
乞丐的生鱼片 2014-07-04
  • 打赏
  • 举报
回复
引用 15 楼 todo9351 的回复:
楼主是用libiconv 吧。 就是要注意一下,转换过程中会修改原来的空间的内容。 还有就是原来字符的编码是不是 指定的,如 UTF-8 转成 GBK ,如果原来的字符是GBK的,那转一下立马就出错了。 我也是弄好久才发现的。
我是拿到网络的报文,存在字符串中,能肯定原来的编码格式就是Unicode,你觉得,哪里还会有问题呢?大神
todo9351 2014-07-01
  • 打赏
  • 举报
回复
楼主是用libiconv 吧。 就是要注意一下,转换过程中会修改原来的空间的内容。 还有就是原来字符的编码是不是 指定的,如 UTF-8 转成 GBK ,如果原来的字符是GBK的,那转一下立马就出错了。 我也是弄好久才发现的。
乞丐的生鱼片 2014-06-27
  • 打赏
  • 举报
回复
ssize_t convert(const char *tocode, const char *fromcode, char *inbufp, size_t inbytesleft, char *outbufp, size_t outbytesleft) { iconv_t ic; size_t outbytes = outbytesleft; size_t intbytes = inbytesleft; int ret; char *in, *out; in = (char *)inbufp; out = (char *)outbufp; ic = iconv_open (tocode, fromcode); if (ic == (iconv_t ) - 1) { printf ("iconv_open failed: from: %s, to: %s: %s\n", fromcode, tocode, strerror (errno)); return -1; } while (inbytesleft > 0) { printf("conv before\n"); printf("intbytes : %d\n", intbytes); printf("outbytes : %d\n", outbytes); ret = iconv (ic, (char **)&in, &intbytes, (char **)&out, &outbytes); if (ret == -1) { printf ("iconv failed: from: %s, to: %s: %s\n", fromcode, tocode, strerror (errno)); return -1; } printf("conv after\n"); } ret = iconv_close (ic); if (ret == -1) { printf ("iconv_close failed: from: %s, to: %s: %s\n", fromcode, tocode, strerror (errno)); return -1; } return outbytesleft-outbytes; } 有问题么?ionv还是直接退出了,真没法了。。
赵4老师 2014-06-27
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\cvt\*.* 自己写个转码函数。不用iconv这个劳什子了!
乞丐的生鱼片 2014-06-26
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
[quote=引用 10 楼 whenyumen 的回复:] [quote=引用 9 楼 zhao4zhong1 的回复:] 引用 5 楼 zhao4zhong1 的回复: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
关键环境,没有gdb,不允许安装,但是可以把core文件调出来,您看代码有问题么[/quote] core文件拷贝到其它机器上,照样可以使用 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 [/quote] 没用的,我看了,我保证是iconv函数那儿有问题,但是有啥问题呢?。。
赵4老师 2014-06-25
  • 打赏
  • 举报
回复
引用 10 楼 whenyumen 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:] 引用 5 楼 zhao4zhong1 的回复: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
关键环境,没有gdb,不允许安装,但是可以把core文件调出来,您看代码有问题么[/quote] core文件拷贝到其它机器上,照样可以使用 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
乞丐的生鱼片 2014-06-25
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
引用 5 楼 zhao4zhong1 的回复: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
关键环境,没有gdb,不允许安装,但是可以把core文件调出来,您看代码有问题么
赵4老师 2014-06-25
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
乞丐的生鱼片 2014-06-25
  • 打赏
  • 举报
回复
引用 4 楼 colddown 的回复:
gdb 了吗?程序怎么能直接退出呢。
core文件,gbd具体如下,段错误? warning: core file may not match specified executable file. Failed to read a valid object file image from memory. Core was generated by `./JDdecodetds11'. Program terminated with signal 11, Segmentation fault. [New process 8113] [New process 8111] #0 0x305b5ba3 in ?? ()
乞丐的生鱼片 2014-06-25
  • 打赏
  • 举报
回复
引用 4 楼 colddown 的回复:
gdb 了吗?程序怎么能直接退出呢。
没有产生core文件
乞丐的生鱼片 2014-06-25
  • 打赏
  • 举报
回复
引用 3 楼 whenyumen 的回复:
仍没找到任何问题啊。。
是啊,程序从ionv中直接退出了
colddown 2014-06-24
  • 打赏
  • 举报
回复
gdb 了吗?程序怎么能直接退出呢。
乞丐的生鱼片 2014-06-24
  • 打赏
  • 举报
回复
仍没找到任何问题啊。。
乞丐的生鱼片 2014-06-24
  • 打赏
  • 举报
回复
没人用过么?紧急求救啊
乞丐的生鱼片 2014-06-24
  • 打赏
  • 举报
回复
不能沉啊,亲们!!
赵4老师 2014-06-24
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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