UTF8 - GB2312转换
来源:互联网 发布:大主宰 源码 编辑:程序博客网 时间:2024/06/10 05:09
百度百科: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中的缓冲区不被使用。
以下代码转至:http://blog.csdn.net/x_iya/article/details/8579206
在编程过程中需要对字符串进行不同的转换,特别是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;
}
- UTF8 - GB2312转换
- UTF8、GB2312相互转换
- url 编码转换(utf8 - gb2312)
- url 编码转换(utf8 - gb2312)
- UTF8 到GB2312 的 转换
- GB2312和utf8编码转换
- js 编码转换 gb2312 & utf8
- C++ UTF8 编码转换 GB2312
- utf8 和 gb2312 的转换
- GB2312与UTF8相互转换
- UTF8和GB2312编码转换
- GB2312与UTF8互相转换
- gb2312和utf8相互转换:
- c++ gb2312 utf8 转换函数
- C# 编码转换 UTF8转GB2312 GB2312转UTF8
- C# 编码转换 UTF8转GB2312 GB2312转UTF8
- C# 编码转换 UTF8转GB2312 GB2312转UTF8
- C# 编码转换 UTF8转GB2312 GB2312转UTF8
- svn使用
- 【OpenCV】霍夫线变换
- 银行
- 软件开发流程
- styled Texts
- UTF8 - GB2312转换
- 15周项目1-折腾二维数组
- Visual Studio最好用的快捷键
- 如何让搜索引擎抓取AJAX内容?
- foobar2000播放器简单配置 [李园7舍_404]
- 她看见唯一疼她的汉游天下奶奶正向她走过来
- OO实现ALV(一)<转>
- UVa 640 Self Numbers (类似素数筛)
- 小二维数组