windows中提供两个函数为我们做Unicode和ANSI字符串之间的转换,一个是从多字节到宽字符的,MultiByteToWideChar;另外一个是从宽字符到多字节的,WideCharToMultiByte.

下面分别对两个函数做如下说明:

 

View Code 
int MultiByteToWideChar(
UINT codePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cbMultiByte,
PWSTR pWideCharStr,
int cchWideChar

其中uCodePage参数表示一个与要转化的多字符关联的代码页值,如UTF-8等。dwFlags参数允许我们进行额外的控制,它会影响到一些带变音符号的的字符,但是一般情况下我们都用不到这个参数,所以一般给这个参数传入0就可以了。pMutiByteStr参数指定要转换的字符串,cbMultiByte参数指定字符串的长度,以字节数来标识。其中,如果cbMutiByte传的值是-1的话,该函数可以自动判断源字符串的长度。此函数将转换后的Unicode字符串(以uCodePage编码的)写入内存缓冲区,其内存地址是由pWideCharStr参数指定的,且必须在cchWideChar参数中指定这个缓冲区的最大长度(字符数)。如果调用MutiByteToWideChar,并给cchWideChar参数传入0,函数就不会执行转换,而是返回一个一个宽字符数(包括终止字符'\0'),只有当缓冲区能够容纳该数量的宽字符时,转换才会成功。 

一般按照以下步骤将一个多字节字符串转换为Unicode形式:

1. 调用MutiByteToWideChar,为pWideCharStr参数传入NULL,为cchWideChar参数传入0,为cbMultiByte传入-1。

2. 分配一块足以容纳转换后的Unicode字符串的内存。它的大小是上一个MultiByteToWideChar调用()的返回值乘以sizeof(wchar_t);

3. 再次调用MultiByteToWideChar,这次将缓冲区地址作为pWideCharStr参数的值传入,将第一次MultiByteToWideChar调用的返回值诚意sizeof(wchar_t)之后的大小作为cchWideChar参数的值传入。

4. 使用转换后的字符串。

5. 释放Unicode字符串占用的内存块。 

 

同样相对应的是WideCharToMultiByte,这个函数将宽字符字符串转换为多字节字符串,如下所示:

 WINBASEAPI

int
WINAPI
WideCharToMultiByte(
    __in UINT     CodePage,
    __in DWORD    dwFlags,
    __in_ecount(cchWideChar) LPCWSTR  lpWideCharStr,
    __in 
int      cchWideChar,
    __out_bcount_opt(cbMultiByte) __transfer(lpWideCharStr) LPSTR   lpMultiByteStr,
    __in 
int      cbMultiByte,
    __in_opt LPCSTR   lpDefaultChar,
    __out_opt LPBOOL  lpUsedDefaultChar);
 

 相同的参数我们就不多讲了,现在看这个函数要比第一函数多出两个参数,分别是lpDefaultChar和lpUserDefaultChar,下面我们来看看两个参数的作用:

1. 参数lpDefaultChar 只有在CodePage指定的转换中,如果一个字符没有对应的表示,那么才使用该参数,函数会使用lpDefaultChar参数指向的字符。如果这个参数被传入NULL,那么函数将会使用一个系统默认的字符(如'?')来表示转换后的字符。

2. 参数lpUserDefaultChar只想一个布尔型变量:在宽字符转换中,如果至少有一个字符不能被成功转换为相对应的多字节形式,函数就会将这个参数置为TRUE,如果所有字符都能成功转换,那么函数就会把这个参数置为FALSE,所以我们可以在转换完毕之后通过查看这个参数的是否为FALSE来检查转换是否成功。通常情况下,我们会将此参数传入NULL值。

 

posted on 2011-07-31 22:12  冬日的细雨  阅读(1543)  评论(1编辑  收藏  举报