我需要创建一个库,它将公开一些C API。
get_ble_list(char **deviceNames);
在这里,我使用另一个第三方库来获取蓝牙设备列表,该设备将设备名称返回为CAtlStringW。现在我需要将其转换为我能够做的普通C字符数组。但是当谈到非ASCII,Unicode字符时,我没有得到预期的结果。例如:我将手机上的蓝牙名称设置为മലയാളം。但我得到了???作为我使用我的库的测试GUI应用程序的输出。
源字符串是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(...);
}