各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar.doc
文本预览下载声明
MultiByteToWideChar和MultiByteToWideChar对各种字符编码间的转换
函数原型:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。参数:
CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。
参数说明:1、CodePage——指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,可选择以下代码页:CP_ACP?? //当前系统ANSI代码页?????????? CP_MACCP?? //当前系统Macintosh代码页?????????? CP_OEMCP?? //当前系统OEM代码页,一种原始设备制造商硬件扫描码?????????? CP_SYMBOL //Symbol代码页,用于Windows 2000及以后版本????????? CP_THREAD_ACP //当前线程ANSI代码页,用于Windows 2000及以后版本????????? CP_UTF7 //UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL?????????? CP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL????????? 用 GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁体中文,949:韩文2、dwFlags—— 一般用 0 就可以了????????? 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符:????????? MB_PRECOMPOSED //总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。此为函数的默认选项,不能和MB_COMPOSITE合用MB_COMPOSITE //总是使用分解字符,即总是使用基字符+不占空间字符的方式?MB_ERR_INVALID_CHARS //设置此选项,函数遇到非法字符就失败并返回错误码
ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符MB_USEGLYPHCHARS //使用像形字符代替控制字符3、lpMultiByteStr //要转换的字符串4、cbMultiByte //要转换字符串的长度,-1表示转换到字符串结尾。返回原字符串长度。0 作为结束符的字符串5、lpWideCharStr//接收转换后输出的宽字符串的缓冲,如果为 NULL, 就是代表计算生成的字符串的长度。6、cchWideChar//输出缓冲区大小,转化生成的 unicode 字符串缓存的容量。如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不同???? 为0表示调用失败;当cchWideChar为0时,函数将返回所需缓冲区大小int BufSize = MultiByteToWideChar(936,0,s,-1,NULL,0); //计算简体中文字符串 s 转成 widestring 之后占用的内存字节数…… //在此处为 wsbuf 分配内存 BufSize 个字节MultiByteToWideChar(936,0,s,-1,wsbuf,BufSize); //把简体中文字符串 s 转化为 unicode 的 WideString最常用的应该是CP_ACP和CP_UTF8了,前者将宽字符转换为ANSI,后者转换为UTF8。?例一:Unicode转换到GBK#include Windows.h?#define CODE_PAGE_GB18030 54936int Unicode2GBK( wchar_t *pUnicode, char** ppDest){ // get the size of the dest string?const int size = ::WideCharToMultiByte( CODE_PAGE_GB18030, 0/* you can do more for it*/,
pUnicode, -1, 0, 0, 0, 0 );?if ( s
显示全部