UTF8 - GB2312转换

转载 2013年12月03日 17:02:16

百度百科MultiByteToWideChar
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
CodePage:一般默认为0
指定执行转换的字符集,这个参数可以为系统已安装或有效的任何字符集所给定的值。你也可以指定其为下面的任意一值:
CP_ACP:ANSI字符集;CP_MACCP:Macintosh代码页;CP_OEMCP:OEM代码页;
CP_SYMBOL:符号字符集(42);CP_THREAD_ACP:当前线程ANSI代码页
CP_UTF7:使用UTF-7转换;CP_UTF8:使用UTF-8转换
dwFlags:一组未标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。你可以指定下面是标记常量的组合,含义如下:
MB_PRECOMPOSED:通常使用预作字符——就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。这是缺省的转换选择。不能与
MB_COMPOSITE值一起使用。
MB_COMPOSITE:通常使用组合字符——就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。不能与MB_PRECOMPOSED值一起使用。
MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。
MB_USEGLYPHCHARS:使用象形文字替代控制字符
组合字符由一个基础字符和一个非空字符构成,每一个都有不同的字符值。每个预作字符都有单一的字符值给基础/非空字符的组成。在字符è中,e就是基础字符,而重音符标记就是非空字符。
函数的缺省动作是转换成预作的形式。如果预作的形式不存在,函数将尝试转换成组合形式。
标记MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而标记MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS则不管其它标记如何都可以设置。
lpMultiByteStr:指向将被转换字符串的字符。
cchMultiByte:指定由参数lpMultiByteStr指向的字符串中字节的个数。如果lpMultiByteStr指定的字符串以空字符终止,可以设置为-1(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。
lpWideCharStr:指向接收被转换字符串的缓冲区
cchWideChar:指定由参数lpWideCharStr指向的缓冲区的宽字符个数。若此值为零,函数返回缓冲区所必需的宽字符,在这种情况下,lpWideCharStr中的缓冲区不被使用。

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


//UTF-8到GB2312的转换
char* U2G(const char* utf8)
{
//首先将UTF-8编码的多字节字符串转换成UTF-8编码的宽字节字符串
int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);//当前编码为UTF-8,最后一个参数为0,
//则函数返回lpMultiBytestr的包含的字节数;

wchar_t* wstr = new wchar_t[len+1];//开辟一块空间存放宽字节,实际大小为len*2+1
memset(wstr, 0, len+1);
MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);//将const char* utf8中的数据存放到wstr中

//然后将ANSI编码的宽字节字符串转换成ANSI编码的多字节字符串
len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);//先获取ANSI编码下宽字节中数据的长度
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;
}

GB2312简体文字在线转换UTF8代码转换工具

  • 2009年02月16日 01:11
  • 97KB
  • 下载

批量文件编码转换工具(Utf-8转GB2312、GB2312转Utf-8)

  • 2009年11月19日 23:17
  • 5KB
  • 下载

字符集之间转换(UTF-8,UNICODE,Gb2312)

字符集之间转换(UTF-8,UNICODE,Gb2312)特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换.UTF-8:   1~3字节可变UNICODE: 2字节一个字符GB2...
  • xuweiqun
  • xuweiqun
  • 2006年11月07日 00:42
  • 35833

Mac下GBK与UTF8编码文件的批量转换

下载了一个Python改写的C语言100例,结果原作者使用的编码都是GBK,而我现在使用的Sublime Text 2和Textmate等都不支持GBK编码,导致打开全是乱码。网上也没有找到相应的转换...
  • tianxiawuzhei
  • tianxiawuzhei
  • 2015年09月24日 15:11
  • 6213

Mac OS X下各种文件编码的转换方法

何曾几时本猫还在windows下编码的时候,那时ruby的源代码的编码格式都是gbk啊!导致N多中文显示为乱码。后来无奈写了个转换代码从gbk编码转为utf-8格式的小工具: #!/usr/bin/...
  • mydo
  • mydo
  • 2014年12月06日 21:47
  • 17693

UTF8和GB2312的相互转换

char* G2U(const char* gb2312) { int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0); wch...
  • yzf279533105
  • yzf279533105
  • 2016年02月21日 18:48
  • 276

(c语言)gb2312和utf8转换

(c语言)unicode和utf8转换 unicode和utf8转换规则 unicode与gb2312有着转换表 所以,只需要unicode和utf8之间进行转换即可 ...
  • I_study_ing
  • I_study_ing
  • 2017年03月14日 23:42
  • 1250

C++ 字符集转换 codecvt utf-8 gb2312 url

现在的做法: http://www.cppblog.com/mythma/archive/2012/09/11/wstring_convert_utf8.html 扔掉MultiByteToW...
  • ClamReason
  • ClamReason
  • 2013年12月12日 10:13
  • 2137

VC UTF-8与中文(GB2312)相互转换

#include using namespace std;/**********************************************************************...
  • aidy22
  • aidy22
  • 2009年08月04日 11:12
  • 6692

C# UTF-8与GB2312编码的相互转化

1、首先引入命名空间:
  • u014076894
  • u014076894
  • 2014年10月22日 20:59
  • 12458
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UTF8 - GB2312转换
举报原因:
原因补充:

(最多只允许输入30个字)