【原】Linux 与 Windows 通讯中的乱码问题: UTF-8 转 GB2312

=================================================
本文为khler原作,转载必须确保本文完整并完整保留原作者信息及本文原始链接
E-mail: khler@163.com
QQ:     23381103
MSN:   pragmac@hotmail.com

原址:http://www.cnblogs.com/khler/archive/2010/09/27/1836559.html
=================================================

 
    默认情况下Linux使用UTF-8编码,Windows使用GB2312编码,当 Linux 与 Windows 通讯时,中文字符就会出现乱码,原因就是使用了不同的字符集。所以,解决办法当然是统一编码方式!
    我们可以在Linux下将字符串转换成gb2312后再发给Windows,函数代码如下:

 


#include 
< stddef.h >
#include 
< iconv.h >
#include 
< assert.h >
#include 
< stdio.h >
#include 
< cstring >

/* *********************************************************************
 * 函数名称: UTF8ToGB2312
 * 功能描述: UTF-8 字符串转换 GB2312 函数
 * 访问的表: 无
 * 修改的表: 无
 * 输入参数:
 * char* srcStr,UTF-8字符串
 * 输出参数:
 * char* desBuff:接收GB2312转换结果的缓存;
 * int desBuffLength:指定接收转换结果的缓存大小
 * 返 回 值: 转换大小
 * 其它说明: 无
 * 修改日期        版本号     修改人       修改内容
 * -----------------------------------------------
 * 2010.09.27     V1.0     HYH          Create
 *
 **********************************************************************
*/
int  UTF8ToGB2312( char *  srcStr,  char *  desBuff, size_t desBuffLength)
{
    assert(strlen(srcStr)
> 0 );
    size_t iLen 
=  strlen(srcStr);

    iconv_t cd;
    cd 
=  iconv_open( " gb2312 " , " utf-8 " );
    assert(cd 
!=   0 );
    iconv(cd, 
& srcStr,  & iLen,  & desBuff,  & desBuffLength);
    iconv_close(cd);
    
return  desBuffLength;
}

 

    使用时需要特别注意,desBuffLength是用来传入接收转换结果的缓存大小的,告诉iconv()函数我们给它准备了多大的内存。起初我看到 iconv()传递的是它的地址,以为是用来接收转换后的长度的,所以给它设置了0就传递进去了,结果无论如何得到的总是0,当然字符串也没被转换。

 

     GB2312转换到UTF8就很简单了:

 

 



/* *********************************************************************
 * 函数名称: GB2312ToUTF8
 * 功能描述: GB2312 字符串转换 UTF-8 函数
 * 访问的表: 无
 * 修改的表: 无
 * 输入参数:
 * char* srcStr,GB2312字符串
 * 输出参数:
 * char* desBuff:接收UTF-8转换结果的缓存;
 * int desBuffLength:指定接收转换结果的缓存大小
 * 返 回 值: 转换大小
 * 其它说明: 无
 * 修改日期        版本号     修改人       修改内容
 * -----------------------------------------------
 * 2010.09.27     V1.0     HYH          Create
 *
 **********************************************************************
*/
int  GB2312ToUTF8( char *  srcStr,  char *  desBuff, size_t desBuffLength)
{
    assert(strlen(srcStr)
> 0 );
    size_t iLen 
=  strlen(srcStr);

    iconv_t cd;
    cd 
=  iconv_open( " utf-8 " , " gb2312 " );
    assert(cd 
!=   0 );
    iconv(cd, 
& srcStr,  & iLen,  & desBuff,  & desBuffLength);
    iconv_close(cd);
    
return  desBuffLength;
}

 

     本人Linux Ubuntu 9.10下socket服务程序与Windows客户端程序通讯成功,成功解决了Linux 下socket与Windows通讯的乱码问题。

 

转载于:https://www.cnblogs.com/khler/archive/2010/09/27/1836559.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值