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

How can I use UTF-8 string as char* in Visual C++?

本文关键字:字符串 字符 UTF-8 Visual C++      更新时间:2023-10-16

我需要创建一个库来公开一些C API。

get_ble_list(char **deviceNames);

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

源字符串是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*.

这不是可写缓冲区。不要投CAtlStringWCStringWwchar_t*,当然也不要char*这是完全错误的。

对于可写缓冲区,请使用CString::GetBuffer/CString::ReleaseBuffer方法。或者分配要传递的新缓冲区。确保源代码编译时没有警告。

如果 Windows 专门使用 C API,则可以切换到 UTF16。使用wchar_t代替char,使用"宽C字符串"版本的C函数,示例wcscpy代替strcpy

void get_ble_list(wchar_t **deviceNames)
{
...
wcscpy(...);
}