Linux 与 Windows 通讯中的乱码问题: UTF-8 转 GB2312
默认情况下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通讯的乱码问题。