【原】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通讯的乱码问题。

 

发表评论

电子邮件地址不会被公开。