gbk-utf-8

gcc -o msg stdsoap2.c soapC.c soapClient.c client.c stdsoap2.c
更多使用例子,可以查看gsoap附带的sample目录。
编码转换的例子,保证使用utf8传输
int GBKtoUTF8(char *fromstr,size_t fromlen,char *tostr,size_t tolen)
{
    int r; 
    iconv_t cd;

    if ((cd = iconv_open("GBK","UTF-8")) == (iconv_t)-1) {
        fprintf(stderr, "iconv_open from UTF to GBK error: %s\n", strerror(errno));
        return -1;
    }

    r = iconv(cd,&fromstr,&fromlen,&tostr,&tolen);
    if (r < 0) {       
        fprintf(stderr, "iconv from UTF to GBK error: %s\n", strerror(errno));
        iconv_close(cd);
        return -2;
    }

    iconv_close(cd);
    return 0;
}

 

 


#include <windows.h>

#include <vector>

#include <string>

using namespace std;

 

//utf8 转 Unicode

std::wstring Utf82Unicode(const std::string& utf8string)
{
 int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0);
 if (widesize == ERROR_NO_UNICODE_TRANSLATION)
 {
  throw std::exception("Invalid UTF-8 sequence.");
 }
 if (widesize == 0)
 {
  throw std::exception("Error in conversion.");
 }
 
 std::vector<wchar_t> resultstring(widesize);
 
 int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize);
 
 if (convresult != widesize)
 {
  throw std::exception("La falla!");
 }
 
 return std::wstring(&resultstring[0]);
}

//unicode 转为 ascii

string WideByte2Acsi(wstring& wstrcode)
{
 int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL);
 if (asciisize == ERROR_NO_UNICODE_TRANSLATION)
 {
  throw std::exception("Invalid UTF-8 sequence.");
 }
 if (asciisize == 0)
 {
  throw std::exception("Error in conversion.");
 }
    std::vector<char> resultstring(asciisize);
 int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL);
 
 if (convresult != asciisize)
 {
  throw std::exception("La falla!");
 }
 
    return std::string(&resultstring[0]);
}


 

//utf-8 转 ascii

string UTF_82ASCII(string& strUtf8Code)
{
 string strRet("");


 //先把 utf8 转为 unicode
 wstring wstr = Utf82Unicode(strUtf8Code);

 //最后把 unicode 转为 ascii
 strRet = WideByte2Acsi(wstr);


 return strRet;
}

///

//ascii 转 Unicode

wstring Acsi2WideByte(string& strascii)
{
 int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0);
 if (widesize == ERROR_NO_UNICODE_TRANSLATION)
 {
  throw std::exception("Invalid UTF-8 sequence.");
 }
 if (widesize == 0)
 {
  throw std::exception("Error in conversion.");
 }
    std::vector<wchar_t> resultstring(widesize);
 int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize);

 if (convresult != widesize)
 {
  throw std::exception("La falla!");
 }
 
    return std::wstring(&resultstring[0]);
}

//Unicode 转 Utf8

std::string Unicode2Utf8(const std::wstring& widestring)
{
 int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);
 if (utf8size == 0)
 {
  throw std::exception("Error in conversion.");
 }
 
 std::vector<char> resultstring(utf8size);
 
 int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);
 
 if (convresult != utf8size)
 {
  throw std::exception("La falla!");
 }
 
 return std::string(&resultstring[0]);
}

//ascii 转 Utf8

string ASCII2UTF_8(string& strAsciiCode)
{
 string strRet("");


 //先把 ascii 转为 unicode
 wstring wstr = Acsi2WideByte(strAsciiCode);

 //最后把 unicode 转为 utf8

 strRet = Unicode2Utf8(wstr);


 return strRet;
}

 

 

在编程过程中需要对字符串进行不同的转换,特别是Gb2312和Utf-8直接的转换。在几个开源的魔兽私服中,很多都是老外开发的,而暴雪为了能够兼容世界上的各个字符集也使用了UTF-8。在中国使用VS(VS2005以上版本)开发基本都是使用Gb2312的Unicode字符集,所以当在编程过程中就需要进行字符转换,这样才能兼容游戏,否则就是乱码。而在控制台显示字符串时,真好相反需要将UTF-8的字符串转换成Gb2312才能正常显示。

为了解决这个问题,本人将其代码贴出来;其实很多地方都可以使用到字符串的编码转换,代码如下:

//UTF-8到GB2312的转换
char* U2G(const char* utf8)
{
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}

//GB2312到UTF-8的转换
char* G2U(const char* gb2312)
{
int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len+1];
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len+1];
memset(str, 0, len+1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
if(wstr) delete[] wstr;
return str;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值