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

时间:2022-01-04 22:51:29
不同平台下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);
}

10 个解决方案

#1


个人觉得 不应该是 iconv的问题,而是你汉字 你确认第二个就是你所说的utf8? 还是gbk的呢?

#2


确信啊,两个平台上的程序是一样的,编译器不一样而已

#3


是不是你的串口终端不支持utf-8啊?

#4


ARM平台下,我是把UTF-8转成GB2312格式的,再通过串口终端显示出来。
在PC下,UTF-8转成GB2312格式正确,return = 0;
在ARM下,UTF-8转成GB2312格式错误,return = -1;
同一个程序

#5


代码本身没有问题,但是编码的名称在不同的系统上是不一样的,
比如在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

#6


通常大写的UTF-8和GBK比较通用

#7


char geo_addr[100]="xxxxxxxxxx";//由于在Linux下不能正常显示UTF-8编码的汉字,也不

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



这地方就不对,Linux  当然能正常显示UTF-8编码的汉字

#8


我当时没有安装中文rpm,我现在安装了中文汉字库。
系统都变成中文的了。UTF-8格式。

系统能够显示geo_addr[100]="“四川省成都市双流县"
系统默认geo_addr_gb2312不能正常显示,就是这样了。

#9


我在我虚拟机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);
}
不同平台下iconv函数结果不同?

#10


还有就是图片中“create and open file”我在程序中printf("geo_addr_utf8 from xml: %s\n",geo_addr);另起新行,为什么后面的printf("create and open file\n");前面没有换行了

#1


个人觉得 不应该是 iconv的问题,而是你汉字 你确认第二个就是你所说的utf8? 还是gbk的呢?

#2


确信啊,两个平台上的程序是一样的,编译器不一样而已

#3


是不是你的串口终端不支持utf-8啊?

#4


ARM平台下,我是把UTF-8转成GB2312格式的,再通过串口终端显示出来。
在PC下,UTF-8转成GB2312格式正确,return = 0;
在ARM下,UTF-8转成GB2312格式错误,return = -1;
同一个程序

#5


代码本身没有问题,但是编码的名称在不同的系统上是不一样的,
比如在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

#6


通常大写的UTF-8和GBK比较通用

#7


char geo_addr[100]="xxxxxxxxxx";//由于在Linux下不能正常显示UTF-8编码的汉字,也不

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



这地方就不对,Linux  当然能正常显示UTF-8编码的汉字

#8


我当时没有安装中文rpm,我现在安装了中文汉字库。
系统都变成中文的了。UTF-8格式。

系统能够显示geo_addr[100]="“四川省成都市双流县"
系统默认geo_addr_gb2312不能正常显示,就是这样了。

#9


我在我虚拟机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);
}
不同平台下iconv函数结果不同?

#10


还有就是图片中“create and open file”我在程序中printf("geo_addr_utf8 from xml: %s\n",geo_addr);另起新行,为什么后面的printf("create and open file\n");前面没有换行了