自学内容网 自学内容网

Windows下多字节字符转宽字符

前面文章说了一个奇怪的情况, 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)。


原文地址:https://blog.csdn.net/caz28/article/details/142661674

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!