不同平台下iconv函数结果不同?

elesun8 2015-01-16 11:39:42
不同平台下iconv函数结果不同?
****************************字符串定义******************************************
char geo_addr[100]="xxxxxxxxxx";//由于在Linux下不能正常显示UTF-8编码的汉字,也不

能正常保存,我用XXX表示,XXX内容为“四川省成都市双流县”汉字字符串的UTF-8编码形



char geo_addr_gb2312[100];//这是要得到的结果,应该为“四川省成都市双流县”
****************************实现函数*******************************************
采用函数u2g实现unicode UTF-8汉字转换成GB2312汉字
//unicode to gb2312
rc = u2g(geo_addr,strlen(geo_addr),geo_addr_gb2312,sizeof(geo_addr_gb2312));
函数的实现见下面代码:在iconv_app.c文件中
****************************平台1 PC 虚拟机 Linux redhat***********************
[PC 虚拟机 redhat Linux]# uname -r
2.6.18-53.el5
[PC 虚拟机 redhat Linux]# arm-linux-gcc -v
gcc version 4.3.2
[PC 虚拟机 redhat Linux]# gcc -v
gcc version 4.3.2
执行函数u2g,rc=0,geo_addr_gb2312[]="四川省成都市双流县"
正确
****************************平台2 ARM 迷你2440 Linux***************************
mini2440 ARM Linux 启动内核信息如下:
Linux version 2.6.29.4-FriendlyARM (gcc version 4.3.2)
执行函数u2g,rc=-1,geo_addr_gb2312[]= (无显示)
错误
*****************************iconv_app.c文件内容如下***************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h>


//代码转换:从一种编码转为另一种编码
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,&inlen,pout,&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);
}
...全文
180 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
elesun8 2015-01-21
  • 打赏
  • 举报
回复
还有就是图片中“create and open file”我在程序中printf("geo_addr_utf8 from xml: %s\n",geo_addr);另起新行,为什么后面的printf("create and open file\n");前面没有换行了
elesun8 2015-01-21
  • 打赏
  • 举报
回复
我在我虚拟机Linux redhat #iconv -l | grep -iE "utf|gb" 显示结果同 5楼
代码中code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
我已经改过多次(UTF8 UTF-8 GBK GB2312)都不行。
//代码转换:从一种编码转为另一种编码
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,&inlen,pout,&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);
}
elesun8 2015-01-20
  • 打赏
  • 举报
回复
我当时没有安装中文rpm,我现在安装了中文汉字库。 系统都变成中文的了。UTF-8格式。 系统能够显示geo_addr[100]="“四川省成都市双流县" 系统默认geo_addr_gb2312不能正常显示,就是这样了。
mymtom 2015-01-19
  • 打赏
  • 举报
回复
通常大写的UTF-8和GBK比较通用
mymtom 2015-01-19
  • 打赏
  • 举报
回复
代码本身没有问题,但是编码的名称在不同的系统上是不一样的, 比如在AIX上可能没有gb2312,而是GB2312,或者干脆就没有GB2312, 而是更新的GB18030 用下面的命令看看系统上到底支持哪些编码和编码的确切名称。注意大小写,有些iconv的实现是区分大小写的。 iconv -l | grep -iE "utf|gb" Linux Linux 2.6.32-131.0.15.el6.x86_64 #1 SMP Tue May 10 15:42:40 EDT 2011 x86_64 CN-GB// CSGB2312// CSISO58GB1988// EBCDIC-CP-GB// GB// GB2312// GB13000// GB18030// GBK// GB_1988-80// GB_198880// ISO-10646/UTF-8/ ISO-10646/UTF8/ ISO646-GB// UTF-7// UTF-8// UTF-16// UTF-16BE// UTF-16LE// UTF-32// UTF-32BE// UTF-32LE// UTF7// UTF8// UTF16// UTF16BE// UTF16LE// UTF32// UTF32BE// UTF32LE// AIX AIX 1 6 00F8359A4C00 GB18030 GBK UTF-16 UTF-16le UTF-32 UTF-8
zhxianbin 2015-01-19
  • 打赏
  • 举报
回复
char geo_addr[100]="xxxxxxxxxx";//由于在Linux下不能正常显示UTF-8编码的汉字,也不 能正常保存,我用XXX表示,XXX内容为“四川省成都市双流县”汉字字符串的UTF-8编码形 式 这地方就不对,Linux 当然能正常显示UTF-8编码的汉字
elesun8 2015-01-18
  • 打赏
  • 举报
回复
ARM平台下,我是把UTF-8转成GB2312格式的,再通过串口终端显示出来。 在PC下,UTF-8转成GB2312格式正确,return = 0; 在ARM下,UTF-8转成GB2312格式错误,return = -1; 同一个程序
sprawling 2015-01-17
  • 打赏
  • 举报
回复
是不是你的串口终端不支持utf-8啊?
elesun8 2015-01-17
  • 打赏
  • 举报
回复
确信啊,两个平台上的程序是一样的,编译器不一样而已
tiny丶 2015-01-16
  • 打赏
  • 举报
回复
个人觉得 不应该是 iconv的问题,而是你汉字 你确认第二个就是你所说的utf8? 还是gbk的呢?

23,125

社区成员

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

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