如何在Visual C ++中将UTF-8字符串用作char *?

时间:2018-08-31 11:56:51

标签: c++ visual-c++ unicode visual-studio-2015 utf-8

我需要创建一个库,该库将公开一些C API。

get_ble_list(char **deviceNames);

在这里,我使用另一个第三方库来获取蓝牙设备列表,该列表将设备名称返回为CAtlStringW。 现在,我需要将其转换为我可以执行的普通C字符数组。但是,对于非ASCII,Unicode字符,我没有得到预期的结果。 例如:我在手机上将蓝牙名称设置为name。但是我得到了???作为使用我的库的测试GUI应用程序上的输出。

1 个答案:

答案 0 :(得分:1)

源字符串为CStringW,而不是基类CAtlStringW。使用CA2WCW2A在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*

这不是可写缓冲区。请勿将CAtlStringWCStringW投射到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(...);
}