各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar
- 格式:doc
- 大小:67.50 KB
- 文档页数:20
前谈过一篇关于Linux下面Unicode使用的文章。
那个主要是针对多字节和宽字符的转换而谈的。
今天说的有些类似,主要是windows下面关于字符编码转换和Linux下面的不同。
我移植的那部分程序中,有函数是用来实现UTF-8和GBK之间的转换的。
其实其他很多不同类型的字符之间转换都可以用这种方法。
先说windows。
因为windows下面没有函数可以实现这一功能,所以得自己写。
思路很简单,就是利用之前讲过的那两个函数来实现,即:MultiByteToWideChar和WideCh arToMultiByte来实现。
先将其中一种编码(如UTF-8)利用MultiByteToWideChar转换为宽字节,然后再利用WideCharToMultiByte转换为另一种编码(如GBK)。
反过来也是一样的。
下面给出代码:LONG UTF8ToGBK(const void * lpUTF8Str, string & str){if(lpUTF8Str == NULL) return -1;int nRetLen = 0;//获取转换到Unicode编码后所需要的字符空间长度nRetLen = ::MultiByteToWideChar(CP_UTF8, 0,(char *)lpUTF8Str, -1, NULL, NULL);WCHAR *lpUnicodeStr = new WCHAR[nRetLen + 1];//为Unicode字符串空间//转换到Unicode编码nRetLen = ::MultiByteToWideChar(CP_UTF8, 0,(char *)lpUTF8Str, -1, lpUnicodeStr, nRetLen);if(!nRetLen){delete []lpUnicodeStr; return -1;}//获取转换到GBK编码后所需要的字符空间长度nRetLen = ::WideCharToMultiByte(CP_ACP, 0, lpUnicodeStr,-1, NULL, NULL, NULL, NULL);CHAR *lpGBKStr = new CHAR[nRetLen + 1];nRetLen = ::WideCharToMultiByte(CP_ACP, 0, lpUnicodeStr,-1, (char *)lpGBKStr, nRetLen, NULL, NULL);//转换到GBK编码if(!nRetLen){delete []lpUnicodeStr;delete []lpGBKStr;return -2;}str = lpGBKStr;delete []lpUnicodeStr;delete []lpGBKStr;return 0;}再来看Linux,它已经提供了函数可以实现这一功能,不仅如此,Linux还可以实现批量文件的字符编码转换呢。
mfc默认编码格式-回复MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++类库。
在MFC中,默认编码格式是基于Unicode字符集的。
这个默认编码格式的设定是有一定历史原因的,与Windows操作系统的发展和国际化需求密切相关。
在本文中,我们将一步一步回答关于MFC 默认编码格式的问题,并探讨为何要采用Unicode作为默认编码格式以及如何在MFC中进行编码转换。
首先,我们需要了解什么是编码格式。
编码格式是一种将字符映射到数字代码的规则。
在计算机中,所有的字符都可以用数字表示。
不同的编码格式采用不同的字符映射规则,将字符和数字代码进行关联。
在早期的计算机系统中,使用的是ASCII编码格式,它只能表示英文字符和一些常见的符号。
然而,随着计算机的普及和国际化的需求增长,ASCII编码的字符范围已经无法满足需求了。
为解决字符编码的限制,主要出现了两种解决方案:多字节编码和Unicode编码。
多字节编码通过使用多个字节来表示一个字符,可以表示更多的字符,但是在不同的编码方式之间进行转换时可能会出现乱码的问题。
而Unicode编码采用固定的两个字节来表示一个字符,可以表示几乎所有国家和地区的字符,解决了多字节编码的转换问题。
在原始的MFC类库中,默认采用的是基于ANSI编码(也称作MBCS,多字节字符集)的编码格式。
这是因为在早期的Windows版本中,多字节编码是主要的字符编码方式。
然而,随着Windows的发展和全球化的需求,Unicode编码逐渐成为主流。
为了适应这一变化,微软于1995年引入了一个新的MFC类库版本(MFC 4.2),默认采用的编码格式是Unicode字符集。
Unicode编码格式在MFC中被称为UNICODE编码。
它与ANSI编码之间的转换并不简单,因为它们采用了不同的字符编码规则。
为了进行编码转换,MFC提供了一些用于转换的函数,如MultiByteToWideChar和WideCharToMultiByte。
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都必须为NULLCP_UTF8 //UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL用GetLocaleInfo 函数获取当前系统的代码页,936: 简体中文, 950: 繁体中文,949:韩文2、dwFlags——一般用0 就可以了指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符:MB_PRECOMPOSED //总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。
常见的三种中文内码转换代码常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持。
网上也有很多中文内码的转换工具,什么专家,大师,巨匠之类所有光辉灿烂的名字都被使用了,但是在自己的程序中集成这些功能岂不是更好。
以前曾广泛流传过使用码表来转换中文内码的Code,但毕竟不完美,而且还要携带或内置一个巨大的表,浪费资源。
Windows中提供了MultiByteToWideChar和WideCharToMultiByte两兄弟函数,足可以搞定这些功能了。
在我以前写的一个小工具InfoCode里曾用到过类似代码。
以下代码经过收集整理调试编译测试以下四个函数分别实现:大五码转GBK码/GBK转大五码GB2312码转GBK码/GBK码转GB2312码于是有人要问了,为什么没有GB2312转BIG5和BIG5转GB2312呢,我们有GBK,可以做一下中转啊。
可以将GB2312转成GBK,再将GBK转成BIG5,反之亦然。
//---------------------------------------------------------------------------// 大五码转GBK码:// い地チ㎝瓣 --> 中華人民共和國void __fastcall BIG52GBK(char *szBuf){if(!strcmp(szBuf, ""))return;int nStrLen = strlen(szBuf);wchar_t *pws = new wchar_t[nStrLen + 1];try{int nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, p ws, nStrLen + 1);BOOL bValue = false;nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);szBuf[nReturn] = 0;}__finally{delete[] pws;}}//---------------------------------------------------------------------------// GBK转大五码// 中華人民共和國 --> い地チ㎝瓣void __fastcall GBK2BIG5(char *szBuf){if(!strcmp(szBuf, ""))return ;int nStrLen = strlen(szBuf);wchar_t *pws = new wchar_t[nStrLen + 1];try{MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);BOOL bValue = false;WideCharT oMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);szBuf[nStrLen] = 0;}__finally{delete[] pws;}}//----------------------------------------------------------------------------// 抱歉,这个提示又来了,为了防止不负责任的转载者,只好在此留些信息。
中文处理问题(Unicode和Ascii的编码问题)前段时间电脑显示中文不正常,就是因为把“控制面板”里的“语言地区设置”高级选项中设置为把非Unicode字符当English Unite State 地区来处理,不是China (PRC). 因为要做测试的程序不支持中文,改了上面说到的语言选项之后就出问题了。
结果别人发来的QQ信息都看不到,全部显示乱码。
跟踪调试了好几次,终于把这个问题解决了。
首先修改的是StringtoHex 和HexToString 两个函数,可以看出这两个函数明显不支持中文。
它在里面使用Len()Asc() Hex()等函数来作String变量到二进制字符串的转换。
由于中文汉字有两个字节大小,而Len()都是但作一个长度来处理,在加上Asc()处理中文字符,都是返回负数。
所以重写了这两个函数改成对字符串字节作处理,直接处理Byte到二进制表示法字符串的变换,很方便。
使用dim strtemp as stringdim a() as bytea=System.Text.Encoding.Unicode.GetBytes(strTemp.tochar)便可以获取字符串保存的数据byte信息了。
但是关键的地方还不是上面的那个函数,而是一个加解密的函数。
经过跟踪发现,这个函数加密后返回的字符串字节长度增加了。
可以看到是先用len()来计算字符串长度,再调用微软的加密解密函数库来加密,然后用一个Left()函数来截取加密后的字符串返回。
就是控制面板里的语言选项设置导致把加密函数库返回的字符串字节当作Unicode来处理,所以最后采用Left()截取的字符串和传进去的字符串字节长度不一样,这就是问题的根源。
由于中全部字符串都是当作Unicode来处理。
当把Ascii字母传给微软加密库之后,得到的却是自动转换而来的Unicode字符。
我曾想过字节编写函数把这个unicode 的两个字节分离成两个AscIi字符。
Windows平台下默认的Unicode编码是UTF-16,所以上面的两个函数都是基于UFT-16的。
MultiByteToWideChar()---------------------Maps a character string to a wide character (Unicode UTF-16) string. The character string mapped by this function is not necessarily from a multibyte character set. Note 8 (code page 65001) or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If use o 这个函数倒是明确说了是把一个ANSI转换为UTF-16编码。
反向转换函数就没有细说了。
WideCharToMultiByte()---------------------Maps a wide character string to a new character string. The new character string is not necessarily from a mult 8 (code page 65001) or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If use o尤其在xml文档的声明部分又可以指定tagging标明使用的encoding = utf-8/utf-16/gb2312等编码。
可是保存的时候又可以存储为UTF-8/UTF-16/ANSI等。
多字节字符串与宽字符串的转换可使用C API者Win32 API.C API: mbstowcs,wcstombsWin32 API: MultiByteToWideChar, WideCharToMultiByte下面着重介绍Win32 API的用法,C API的用法较为简单可参照Win32 API。
首先是WideCharToMultiByte通常你需要配置4个参数(其他参数如是使用即可),红色标记的部分。
依次是源宽字符串,需要转换的长度(-1,则为转换整个字符串),目标多字节字符串,目标缓冲区长度。
返回值表示转换为目标多字节字符串实际需要的长度(包括结束符)。
所以通常需要调用WideCharToMultiByte两次:第一次产生目标缓冲区长度,第二次产生目标字符串,像下面这样wchar_t* wcs = L"中国,你好!I Love You!";int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0, wcs, -1, NULL, 0, NULL, NULL);char* mbs = new char[ lengthOfMbs ];WideCharToMultiByte( CP_ACP, 0, wcs, -1, mbs, lengthOfMbs, NULL, NULL);delete mbs;mbs = NULL;MultiByteToWideChar的用法类似char* mbs = "中国,你好!I Love You!";int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs, -1, NULL, 0 );wchar_t* wcs = new wchar_t[ lengthOfWcs ];MultiByteToWideChar( CP_ACP, 0, mbs, -1, wcs, lengthOfWcs );delete wcs;wcs = NULL;下面两个函数封装了转换过程#include <Windows.h>#include <string>std::string WcsToMbs( const std::wstring& wcs ) {int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, NULL, 0, NULL, NULL);char* mbs = new char[ lengthOfMbs ];WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, mbs, lengthOfMbs, NULL, NULL);std::string result = mbs;delete mbs;mbs = NULL;return result;}std::wstring MbsToWcs( const std::string& mbs ) {int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, NULL, 0 );wchar_t* wcs = new wchar_t[ lengthOfWcs ];MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, wcs, lengthOfWcs );std::wstring result = wcs;delete wcs;wcs = NULL;return result;}不管什么时候,只要COM方法返回一个串,这个串都是Unicode串(这里指的是写入COM 规范的所有方法)。
MultiByteToWideChar和WideCharToMultiByte用法详解注意:这两个函数是由Windows提供的转换函数,不具有通用性C语言提供的转换函数为mbstowcs()/wcstombs()一、函数简单介绍涉及到的头文件:函数所在头文件:windows.h#include <windows.h>wchar_t类型所需头文件:wchar.h#include <wchar.h>( 1 ) MultiByteToWideChar()函数功能:该函数映射一个字符串到一个宽字符(unicode)的字符串。
由该函数映射的字符串没必要是多字节字符组。
函数原型:int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cchMultiByte,LPWSTR lpWideCharStr,int cchWideChar);参数:1> CodePage:指定执行转换的多字节字符所使用的字符集这个参数可以为系统已安装或有效的任何字符集所给定的值。
你也可以指定其为下面的任意一值:2> dwFlags:一组位标记,用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。
你可以指定下面是标记常量的组合,含义如下:MB_PRECOMPOSED:通常使用预作字符——就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。
这是缺省的转换选择。
不能与MB_COMPOSITE值一起使用。
MB_COMPOSITE:通常使用组合字符——就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。
不能与MB_PRECOMPOSED值一起使用。
MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION 值。
unicode与ansi转换规则Unicode和ANSI都是字符编码标准,但是它们之间存在转换规则,因为两种编码方式之间并不兼容。
在进行字符转换时,需要一定的方法来确保成功转换。
本文将阐述Unicode和ANSI之间的转换规则,并详细描述如何完成转换。
一、Unicode和ANSI的概述Unicode是一种字符编码标准,可以用来表示世界上大多数语言的字符。
它的编码范围广泛,包括从基本的拉丁字母到中文和阿拉伯字符。
Unicode使用16位和32位编码方案,其中16位编码支持计算机基础设施的交换,32位编码则支持更高级别的语言如藏文和古文物。
ANSI(American National Standards Institute)是一种表示字符的方式,是一种针对西方语言所设计的字符编码标准。
ANSI编码支持虚拟码、ASCII码和扩展ASCII码。
二、Unicode向ANSI转换的方法以下列出三种常见的Unicode向ANSI转换的方法。
1、直接截取转换Unicode和ANSI编码之间存在一种直接截取的转换方法。
但需要注意的是,这种方法只适用于转换基本ASCII字符,不适用于转换包含特殊字符或扩展字符集的Unicode字符串。
例如,将Unicode字符串“Hello World”转换为ANSI格式。
在此示例中,ASCII字符集不包括特殊字符或扩展字符集,因此,直接使用左到右转换将字符截取即可。
Unicode字符串:H e l l o W o r l dANSI字符串:H e l l o W o r l d2、使用API转换许多编程语言提供了API(应用程序接口)来支持Unicode和ANSI之间的相互转换。
在这种情况下,可以使用API转换在Unicode和ANSI之间进行转换,而不必考虑具体字符集的范围。
在C ++中,可以使用WideCharToMultiByte API将Unicode字符串转换为ANSI字符串。
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都必须为NULLCP_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 stringconst int size = ::WideCharToMultiByte( CODE_PAGE_GB18030, 0/* you can do more for it*/,pUnicode, -1, 0, 0, 0, 0 );if ( size == 0 ) { return -1; }char* pDestString = new char[size + 2];::memset( pDestString, 0, sizeof(pDestString) );// transformint ret = ::WideCharToMultiByte( CODE_PAGE_GB18030, 0, pUnicode, -1, pDestString, size, 0, 0 );if( ret == 0 ) { delete pDestString; return -1; }else { *ppDest = pDestString; return 0; } }例二:字串转换wchar_t* pwszUnicode = "Holle, word! 你好,中国!";int iSize;char* pszMultiByte;iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);pszMultiByte = (char*)malloc((iSize+1)/**sizeof(char)*/); WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);注意事项:dwFlags:指定如何处理没有转换的字符,但不设此参数函数会运行的更快一些,我都是把它设为0。
可设的值如下表所示:WC_NO_BEST_FIT_CHARS 把不能直接转换成相应多字节字符的Unicode字符转换成lpDefaultChar指定的默认字符。
也就是说,如果把Unicode转换成多字节字符,然后再转换回来,你并不一定得到相同的Unicode字符,因为这期间可能使用了默认字符。
此选项可以单独使用,也可以和其他选项一起使用。
WC_COMPOSITECHECK 把合成字符转换成预制的字符。
它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项WC_SEPCHARS相同。
WC_ERR_INVALID_CHARS 此选项会致使函数遇到无效字符时失败返回,并且GetLastError会返回错误码ERROR_NO_UNICODE_TRANSLATION。
否则函数会自动丢弃非法字符。
此选项只能用于UTF8。
WC_DISCARDNS 转换时丢弃不占空间的字符,与WC_COMPOSITECHECK一起使用WC_SEPCHARS 转换时产生单独的字符,此是默认转换选项,与WC_COMPOSITECHECK一起使用WC_DEFAULTCHAR 转换时使用默认字符代替例外的字符,(最常见的如’?’),与WC_COMPOSITECHECK一起使用。
当指定WC_COMPOSITECHECK时,函数会将合成字符转换成预制字符。
合成字符由一个基字符和一个不占空间的字符(如欧洲国家及汉语拼音的音标)组成,每一个都有不同的字符值。
预制字符有一个用于表示基字符和不占空间字符的合成体的单一的字符值。
当指定WC_COMPOSITECHECK选项时,也可以使用上表列出的最后3个选项来定制预制字符的转换规则。
这些选项决定了函数在遇到宽字符串的合成字符没有对应的预制字符时的行为,他们与WC_COMPOSITECHECK一起使用,如果都没有指定,函数默认WC_SEPCHARS。
对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS。
50220 5022150222 50225 50227 50229 52936 54936 57002到5701165000(UTF7) 42(Symbol)对于UTF8,dwFlags必须为0或WC_ERR_INVALID_CHARS,否则函数都将失败返回并设置错误码ERROR_INVALID_FLAGS,你可以调用GetLastError获得。
lpUsedDefaultChar:开关变量的指针,用以表明是否使用过默认字符。
对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。
lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。
第二个是多字节字符到宽字符转换函数,函数原型如下:> int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cbMultiByte,LPWSTR lpWideCharStr,int cchWideChar);此函数把多字节字符串转换成宽字符串(Unicode),待转换的字符串并不一定是多字节的。
此函数的参数,返回值及注意事项参见上面函数WideCharToMultiByte的说明,这里只对dwFlags做简单解释。
dwFlags:指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。
MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。
此为函数的默认选项,不能和MB_COMPOSITE合用MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符MB_USEGLYPHCHARS 使用像形字符代替控制字符对于下列代码页,dwFlags必须为0,否则函数返回错误码ERROR_INVALID_FLAGS。
50220 5022150222 50225 50227 50229 52936 54936 57002到5701165000(UTF7) 42(Symbol)对于UTF8,dwFlags必须为0或MB_ERR_INVALID_CHARS,否则函数都将失败并返回错误码ERROR_INVALID_FLAGS。