跨平台的中文编码问题

        卓越的程序在各平台之间来回切换时不需要考虑编码问题,然而在实际应用当中很难做到这一点,退而求其次,当程序需要适应多平台时,如果能把编码问题局限于很小的某个功能模块内,最大限度地降低业务逻辑与数据交互之间的耦合度,也是一款比较不错的程序了。

        以实际工作为例,要把公司主线产品移植到linux内核的麒麟操作系统中,产品在中文Windows系统中运行正常,在麒麟系统下就会出现崩溃等情况,经检查,因为配置文件,输入数据文件等都是从Windows下面拷进来的,其中的中文是以gb2312编码的,而麒麟下是以utf-8为默认编码的。于是改变源码、输入数据文件以及源代码的编码为utf-8,解决了一部分问题,但还是运行不正常。又经过一番艰苦卓绝的检查,发现数据库保存了一部分中文,这些中文也是以gb2312编码的,并且这些中文还被当做索引来检索数据,而数据库文件只能由Windows下的一个程序来生成,而改变这个Windows下的程序让它生成utf-8编码的数据库文件已经不赶趟了。

        再后来,发现从数据库文件到系统应用逻辑,中间存在一次编码转换,是从QString到stdstring的转换,而这次转换提供了我们做手脚的契机。正是在这里,我把它改成了utf-8编码的,一劳永逸!真心感谢程序的作者有这样的先见之明,这里便是细如蜂腰的耦合度。

        linux下进行编码转换可以使用Iconv,这里贴出从gb2312转到utf-8的代码,从网上找的:

int  gb2312toutf8(const char *sourcebuf,size_t sourcelen,char *destbuf,size_t destlen) 
{   
    iconv_t cd;   
    if( (cd = iconv_open("utf-8","gb2312")) ==0 )     
        return -1;   
    memset(destbuf,0,destlen);   
    const char **source = &sourcebuf;   
    char **dest = &destbuf;
    if(-1 == iconv(cd,source,&sourcelen,dest,&destlen))     
        return -1;   

    iconv_close(cd);   

    return 0;    
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值