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

问题描述 投票:-1回答:1

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

get_ble_list(char **deviceNames);

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

c++ visual-c++ unicode visual-studio-2015 utf-8
1个回答
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(...);
}
© www.soinside.com 2019 - 2024. All rights reserved.