WideCharToMultiByte

来源:互联网 发布:c语言实现多线程 编辑:程序博客网 时间:2024/06/13 19:01
 

WideCharToMultiByte

 

函数功能:该函数映射一个unicode字符串到一个多字节字符串。 (---Unicode转ANSI(GB2312))

 

函数原型:

int WideCharToMultiByte(

UINT CodePage,

DWORD dwFlags,

LPWSTR lpWideCharStr,

int cchWideChar,

LPCSTR lpMultiByteStr,

int cchMultiByte,

LPCSTR lpDefaultChar,

PBOOL pfUsedDefaultChar

);

 

参数:   

CodePage:指定执行转换的代码页,这个参数可以为系统已安装或有效的任何代码页所给定的值。你也可以指定其为下面的任意一值: (我想最常用的应该是CP_ACP和CP_UTF8了,前者将宽字符转换为ANSI,后者转换为UTF8。 )  

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: 指定如何处理没有转换的字符,但不设此参数函数会运行的更快一些,我都是把它设为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 50221 50222 50225 50227 50229 52936 54936 57002到57011 65000(UTF7) 42(Symbol)

对于UTF8,dwFlags必须为0或WC_ERR_INVALID_CHARS,否则函数都将失败返回并设置错误码ERROR_INVALID_FLAGS,你可以调用GetLastError获得。

 

 

lpWideCharStr: 待转换的宽字符串。

 

cchWideChar: 待转换宽字符串的长度,-1表示转换到字符串结尾。

 

lpMultiByteStr: 接收转换后输出新串的缓冲区。

 

cbMultiByte: 输出缓冲区大小,如果为0,lpMultiByteStr将被忽略,函数将返回所需缓冲区大小而不使用lpMultiByteStr。

 

lpDefaultChar: 指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。如果为NULL则使用系统默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。

 

lpUsedDefaultChar:开关变量的指针,用以表明是否使用过默认字符。对于要求此参数为NULL的dwFlags而使用此参数,函数将失败返回并设置错误码ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都设为NULL,函数会更快一些。

 

返回值: 如果函数成功,且cbMultiByte非0,返回写入lpMultiByteStr的字节数(包括字符串结尾的null);cbMultiByte为0,则返回转换所需 字节数。函数失败,返回0。

若想获得更多错误信息,请调用GetLastError函数。它可以返回下面所列错误代码:   ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;   ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。   

注意:指针lpMultiByteStr和lpWideCharStr必须不一样。如果一样,函数将失败,GetLastError将返回ERROR_INVALID_PARAMETER的值。   

Windows CE:不支持参数CodePage中的CP_UTF7和CP_UTF8的值,以及参数dwFlags中的WC_NO_BEST_FIT_CHARS值。   

速查:Windows NT 3.1、Windows 95以上、Windows CE 1.0以上,头文件:winnls.h;库文件:kernel32.lib。

 

注意:函数WideCharToMultiByte使用不当,会给影响程序的安全。调用此函数会很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为了避免内存泄漏,应确保为输出缓冲区指定合适的大小。我的方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区,详见下面的代码。另外,从Unicode UTF16向非Unicode字符集转换可能会导致数据丢失,因为该字符集可能无法找到表示特定Unicode数据的字符。

 

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