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

[复制链接]
查看11 | 回复10 | 2021-1-27 06:25:48 | 显示全部楼层 |阅读模式
不同平台下iconv函数结果不同?
****************************字符串定义******************************************
chargeo_addr[100]="xxxxxxxxxx";//由于在Linux下不能正常显示UTF-8编码的汉字,也不
能正常保存,我用XXX表示,XXX内容为“四川省成都市双流县”汉字字符串的UTF-8编码形

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

//代码转换:从一种编码转为另一种编码
intcode_convert(char*from_charset,char*to_charset,char*inbuf,intinlen,char
*outbuf,intoutlen)
{
iconv_tcd;
intrc;
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);
return0;
}
//UNICODE码转为GB2312码
intu2g(char*inbuf,intinlen,char*outbuf,intoutlen)
{
returncode_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
//GB2312码转为UNICODE码
intg2u(char*inbuf,size_tinlen,char*outbuf,size_toutlen)
{
returncode_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
个人觉得不应该是iconv的问题,而是你汉字你确认第二个就是你所说的utf8?还是gbk的呢?

回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
确信啊,两个平台上的程序是一样的,编译器不一样而已
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
是不是你的串口终端不支持utf-8啊?
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
ARM平台下,我是把UTF-8转成GB2312格式的,再通过串口终端显示出来。
在PC下,UTF-8转成GB2312格式正确,return=0;
在ARM下,UTF-8转成GB2312格式错误,return=-1;
同一个程序

回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
代码本身没有问题,但是编码的名称在不同的系统上是不一样的,
比如在AIX上可能没有gb2312,而是GB2312,或者干脆就没有GB2312,而是更新的GB18030
用下面的命令看看系统上到底支持哪些编码和编码的确切名称。注意大小写,有些iconv的实现是区分大小写的。
iconv-l|grep-iE"utf|gb"
Linux
Linux2.6.32-131.0.15.el6.x86_64#1SMPTueMay1015:42:40EDT2011x86_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
AIX1600F8359A4C00
GB18030
GBK
UTF-16
UTF-16le
UTF-32
UTF-8

回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
通常大写的UTF-8和GBK比较通用
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
chargeo_addr[100]="xxxxxxxxxx";//由于在Linux下不能正常显示UTF-8编码的汉字,也不
能正常保存,我用XXX表示,XXX内容为“四川省成都市双流县”汉字字符串的UTF-8编码形

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

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
我当时没有安装中文rpm,我现在安装了中文汉字库。
系统都变成中文的了。UTF-8格式。
系统能够显示geo_addr[100]="“四川省成都市双流县"
系统默认geo_addr_gb2312不能正常显示,就是这样了。
回复

使用道具 举报

千问 | 2021-1-27 06:25:48 | 显示全部楼层
我在我虚拟机Linuxredhat#iconv-l|grep-iE"utf|gb"显示结果同5楼
代码中code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
我已经改过多次(UTF8UTF-8GBKGB2312)都不行。
//代码转换:从一种编码转为另一种编码
intcode_convert(char*from_charset,char*to_charset,char*inbuf,intinlen,char*outbuf,intoutlen)
{
iconv_tcd;
intrc;
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);
return0;
}
//UNICODE码转为GB2312码
intu2g(char*inbuf,intinlen,char*outbuf,intoutlen)
{
returncode_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行