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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值