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

Microsoft Visual Studio 2012 (VS2012) 更改编码格式 "UTF-8"

Microsoft Visual Studio 2012 (VS2012) 更改编码格式 "UTF-8"   由于中文显示经常出现问题, VS2012默认格式为 "GB2312-80" 可能需要修改为...

access数据库编码转换:将将UTF8替换为GB2312

代码
  • Draling
  • Draling
  • 2016年08月17日 12:56
  • 2407

自动将visual stdio创建的文件从gb2312编码转换成utf8编码

cocos2d-x是一个不错的手机游戏框架,不过由于在中文的windows系统下使用visual stdio2008默认创建的类文件,包括.h和.cpp,其文件编码都是gb2312的。当将这些文件在c...

linux文件字符集转换(utf8-gb2312)

一,命令行 在LINUX上进行编码转换时,可以利用iconv命令实现,这是针对文件的,即将指定文件从一种编码转换为另一种编码。 iconv命令用法如下: iconv [选项...] [文...

Linux下 GB2312和UTF8转换接口

#include #include #include #include using namespace std; //Linux下 GB2312和UTF8转换接口 class CUtilT...

pb字符串实现GB2312与Unicode、UTF8之间的相互转换

以下对象用于字符串PB实现GB2312与Unicode、UTF8之间的相互转换,对象的代码将持续完善   $PBExportHeader$n_cst_unicode_cvt.sru forwar...
  • yyoinge
  • yyoinge
  • 2011年08月19日 15:11
  • 9384

从UTF8格式向GB2312格式转换[C源码](转)

/*************************************************************************** * 文 件 名: UTF8_UCS2_GB23...

关于GBK、GB2312、UTF8

  • 2014年12月18日 16:05
  • 3KB
  • 下载

GB2312_ANSI_TO_UTF8

  • 2011年04月02日 01:01
  • 137KB
  • 下载

utf8转为gb2312的函数

一、利用iconv函数族进行编码转换 在LINUX上进行编码转换时,既可以利用iconv函数族编程实现,也可以利用iconv命令来实现,只不过后者是针对文件的,即将指定文件从一种编码转换为另一种编码。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UTF8 - GB2312转换
举报原因:
原因补充:

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