=================================================
本文為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通訊的亂碼問題。