在日常的编程中我们经常会遇到使用别人封装好的库,但是他们的库关于字符串的操作很多是基于ANSI来封装的,这就造成了我们在创建 的Unicode的工程在使用的时候有很多不方便,如果没有这些库的源码来做修改的情况下,我们只能考虑Unicode 和ANSI字符串转换相互转换来满足自己特殊情况的应用;
废话少说,下面直接介绍Unicode 和ANSI字符串转换的方法:
1.多字节 字符串转换为宽字符 字符串(MultiByteToWideChar)
MultiByteToWideChar的函数原型如下:
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar);
转换的步骤为:
使用的一般步骤如下:
MultiByteToWideChar:
1)调用MultiByteToWideChar,为lpWideCharStr参数传入NULL,为cchWideChar参数传入0,为cchMultiByte参数传入-1;
2)分配一块足够容纳转换后Unicode字符串的内存,它的大小是上一个MultiByteToWideChar调用的返回值乘以sizeof(wchar_t);
3)再次调用MultiByteToWideChar,这一次将缓冲区地址作为lpWideCharStr参数的值传入,将第一次MultiByteToWideChar调用的返回值乘以sizeof(wchar_t) 后得到的大小的作为cchWideChar参数的值传入;
4)使用转换后的字符串;
5)释放Unicode字符串占用的内存块。
2.宽字符 字符串 转换为 多字节 字符串(WideCharToMultiByte)
先来看一下WideChatToMultiByte的定义:
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPWSTR lpWideCharStr,
int cchWideChar,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPCSTR lpDefaultChar,
PBOOL pfUsedDefaultChar );
这个函数和MultiByteToWideChar的操作步骤是一样的,唯一的不同就是:返回值直接就是确保转换成功所需的字节数,所以无需执行乘法运算。
注意:WideCharToMultiByte比MultiByteToWideChar相比多两个参数lpDefaultChar和pfUsedDefaultChar,这两个参数只有在以下情况下才会用到: 当一个字符在uCodePage指定的代码页中没有对应的表示是,才会用到这两个参数;
当遇到一个不能转换的宽字符时,pDefaultChar指定的字符便被用来替代不能转换的宽字符的字符;如果pDefault指定为NULL,函数会使用一个系统默认的字符,一般情况下为问号,这对文件明来说是比较危险的,因为问号是一个通配符;
pfUsedDefaultChar指向一个布尔变量,如果宽字符转换过程中,有至少一个字符不能转换为对应的多字节形式,这个函数会被置为TRUE,如果全部成功转换则 返回FALSE;可以用来验证转换是否顺利完成,当然一般情况下我们也会将该参数直接传入NULL;