百度百科:MultiByteToWideChar
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
CodePage:一般默认为0
指定执行转换的
字符集,这个参数可以为系统已安装或有效的任何字符集所给定的值。你也可以指定其为下面的任意一值:
CP_UTF7:使用UTF-7转换;
CP_UTF8:使用UTF-8转换。
MB_PRECOMPOSED:通常使用预作
字符——就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。这是缺省的转换选择。不能与
MB_COMPOSITE值一起使用。
MB_COMPOSITE:通常使用
组合字符——就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。不能与MB_PRECOMPOSED值一起使用。
MB_ERR_INVALID_CHARS:如果函数遇到无效的输入
字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。
MB_USEGLYPHCHARS:使用象形文字替代
控制字符。
函数的缺省动作是转换成预作的形式。如果预作的形式不存在,函数将尝试转换成组合形式。
标记MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而标记MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS则不管其它标记如何都可以设置。
lpMultiByteStr:指向将被转换
字符串的字符。
cchMultiByte:指定由参数lpMultiByteStr指向的字符串中
字节的个数。如果lpMultiByteStr指定的
字符串以空字符终止,可以设置为-1(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。
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;
}