`
philip01
  • 浏览: 47130 次
  • 来自: ...
社区版块
存档分类
最新评论

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;
}

分享到:
评论

相关推荐

    eclipse中class乱码GBK-UTF-8转换工具

    然而,当涉及到字符编码时,如GBK和UTF-8之间的转换,可能会遇到乱码问题。这篇博客文章“eclipse中class乱码GBK-UTF-8转换工具”正是为了解决这个问题。 GBK是GB2312的扩展,包含了更多的汉字和其他字符,主要在...

    批量文件GBK-UTF8编码转换器

    批量文件GBK-UTF8编码转换器

    字符编码简介(unicode-gbk-utf-8)

    在IT行业中,理解不同字符编码体系的重要性不言而喻,特别是Unicode、GBK和UTF-8这三种编码方式。下面将详细介绍这三种编码方式,并通过实例进行解析。 首先,Unicode是国际组织制定的一种标准字符集,旨在包含世界...

    GBK、UTF-8编码转换工具

    GBK、UTF-8批量文件3秒快速转码工具(支持GBK,UTF-8免费转换),UTF-8/GBK编码在线转换工具,压缩包可以有多目录与文件,如目录中有图片不会转码,但是会随转码好的文件一起打包下载。 使用帮助 . 上传压缩包(仅支持zip...

    GBK-UTF8转换程序

    在实际应用中,由于GBK编码和UTF-8编码的差异,当GBK编码的文件在UTF-8环境下打开时,可能会出现乱码问题。反之亦然。因此,这样的转换工具就显得十分必要。它可以帮助用户解决不同编码格式之间的兼容性问题,确保...

    好东西 mySQL数据库latin1-gbk,gbk-utf8,gbk-big5

    mySQL数据库latin1-gbk,gbk-utf8,gbk-big5 博文链接:https://kenter1643.iteye.com/blog/121594

    UTF-8toGBK_labview编码gbk_LabVIEWUTF-8_utf-8toGbk_

    在LabVIEW编程环境中,"UTF-8toGBK.vi"这个程序可能是一个用户自定义的VI(Virtual Instrument),用于将UTF-8编码的字符串转换为GBK编码。LabVIEW作为一个图形化编程语言,提供了丰富的字符串处理函数,其中包括了...

    任意长度GBK-UTF8文本文件转换程序

    GBK和UTF-8是两种常见的文本编码格式,它们在处理中文字符时有着不同的特点。 GBK编码,全称为“汉字内码扩展规范”,是中国大陆广泛使用的汉字编码标准,兼容GB2312,能表示大约2万多个汉字。GBK是在ASCII的基础上...

    c语言gbk、utf8转换编码表及函数

    GBK和UTF-8是两种常见的字符编码格式,它们各有特点并应用于不同的场景。本篇将详细介绍GBK与UTF-8编码的区别,以及如何在C语言中进行这两种编码的转换。 1. **GBK编码** - GBK是中国大陆广泛使用的汉字编码标准,...

    GBK-UTF8转换工具好用

    GBK和UTF-8是两种广泛使用的字符编码标准,尤其在中国大陆,GBK和UTF-8的转换常常是程序员们面临的问题。标题中的"GBK-UTF8转换工具好用"表明这是一个方便程序员进行编码转换的应用程序,而描述中的"GBK UIF-8转换...

    GBK与UTF-8转码(C++)

    ### GBK与UTF-8转码(C++) #### 知识点概述 本文将详细介绍如何在Microsoft Foundation Classes (MFC)环境下实现GBK与UTF-8之间的编码转换。该技术适用于那些需要处理不同字符集数据的应用程序开发场景,特别是在...

    c gbk和 utf-8 转换

    GBK和UTF-8是两种广泛使用的字符编码标准,它们各自有不同的特性和应用场景。本文将深入探讨C语言中如何实现GBK与UTF-8的互相转换,同时不依赖任何外部库。 GBK是中国大陆广泛采用的一种汉字编码标准,它是GB2312的...

    C#写的 GBK GB2312 UTF-8转换

    GBK、GB2312和UTF-8是三种常见的字符编码标准,每种都有其特定的应用场景和特点。C#作为.NET框架下的主要编程语言,提供了丰富的类库支持对不同编码格式之间的转换。 1. **GBK编码**:GBK是中国大陆广泛使用的汉字...

    GBK-UTF8转换器以及n多常用插件utf8版

    GBK和UTF-8是两种常见的字符编码标准,它们各有特点,但也有各自的适用场景。 GBK全称为“汉字内码扩展规范”,是中国大陆广泛使用的汉字编码标准,它在GB2312的基础上增加了许多汉字和符号,可以容纳20902个汉字,...

    GBK-BIG-UTF编码转换软件

    在日常工作中,我们可能遇到不同编码格式的文件,如从互联网下载的文本或邮件,这些文件可能采用GBK或BIG5编码,而在UTF-8为主流的现代环境中,我们需要将它们转换为UTF-8才能正常显示和编辑。同样,如果需要向使用...

    织梦在线订单GBK-UTF版

    该插件支持GBK和UTF-8两种编码,这是因为在中国大陆,GBK是较老但仍然广泛使用的编码格式,而UTF-8则是国际通用的标准编码,能表示几乎所有的语言字符。兼容这两种编码,意味着无论用户使用的浏览器设置如何,插件都...

    utf8转gbk-C语言版本.rar

    本主题聚焦于从UTF-8编码转换到GBK编码的C语言实现,这对于单片机开发尤其关键,因为单片机往往资源有限,且可能需要支持中文显示。 UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode字符集中所有的...

    GBK-UTF8编码转换工具

    GBK,UTF8,编码转换,工具,数据库,模板,网页都可以转换,很方便

Global site tag (gtag.js) - Google Analytics