我需要创建一个库,该库将公开一些C API。
get_ble_list(char **deviceNames);
在这里,我使用另一个第三方库来获取蓝牙设备列表,该列表将设备名称返回为CAtlStringW。 现在,我需要将其转换为我可以执行的普通C字符数组。但是,对于非ASCII,Unicode字符,我没有得到预期的结果。 例如:我在手机上将蓝牙名称设置为name。但是我得到了???作为使用我的库的测试GUI应用程序上的输出。
答案 0 :(得分:1)
源字符串为CStringW
,而不是基类CAtlStringW
。使用CA2W
和CW2A
在UTF8和UTF16之间转换。
#include <Windows.h>
#include <atlstr.h>//Visual Studio specific
...
CStringA utf8 = CW2A(L"മലയാളം", CP_UTF8);
CStringW utf16 = CA2W(utf8, CP_UTF8);
MessageBoxW(0, utf16, 0, 0);
您可以将utf8
投射到const char*
。或将utf16
投射到const wchar_t*
。
这不是可写缓冲区。请勿将CAtlStringW
或CStringW
投射到wchar_t*
,当然也不要char*
,这是完全错误的。
对于可写缓冲区,请使用CString::GetBuffer
/ CString::ReleaseBuffer
方法。或分配新的缓冲区以通过。确保源编译时带有零警告。
如果C API仅由Windows使用,则可以切换到UTF16。使用wchar_t
代替char
,使用C函数的“宽C字符串”版本,例如使用wcscpy
代替strcpy
。
void get_ble_list(wchar_t **deviceNames)
{
...
wcscpy(...);
}