前面文章说了一个奇怪的情况, API用的宽字符版本,代码却是使用多字节字符集。
由于项目比较老, 如果改字符集或宏定义,可能会出现很多问题。
在这个奇怪的情况下编程,要返回Unicode编码字符串,有两种方法:
1. 调用A结尾的API, 使用多字节字符集函数处理后,转为Unicode字符串。
2.调用W结尾的API,使用宽字符集函数处理后,就是Unicode字符串。
综合考虑后,我使用了第一种方案,这里主要讲多字节字符串转为Unicode字符串:
#ifdef UNICODE
UINT codePage = GetACP();
int wLength = MultiByteToWideChar(codePage, 0, mbcsPath, (int)strlen(mbcsPath), NULL, 0);
size_t realLength = (size_t)wLength + 1;
wchar_t* wcharPath = new wchar_t[realLength];
memset(wcharPath, 0, realLength);
MultiByteToWideChar(codePage, 0, mbcsPath, (int)strlen(mbcsPath), wcharPath, wLength);
//using wcharPath
... ...
delete[] wcharPath;
#else
... ...
#endif
GetACP() 是获取当前代码页,我们要知道当前字符串编码。
MultiByteToWideChar调用两遍,第一次调用,buff用的NULL,目的是计算转换后字符个数,便于申请内存。
第二次调用,buff使用的申请的内存,才是真的转换。
这种调用方式,在需要buff的接口里很常见。
宽字符转多字节字符的API是:WideCharToMultiByte。这两个API的第一个参数都是:
UINT CodePage
这个代码页都是指多字节字符串的代码页,MultiByteToWideChar的源字符串和WideCharToMultiByte的目标字符串的代码页。
因为宽字符串的编码都是Unicode(utf16)。