如何在 Visual C++ 中使用 UTF-8 字符串作为字符*?
How can I use UTF-8 string as char* in Visual C++?
我需要创建一个库来公开一些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
方法。或者分配要传递的新缓冲区。确保源代码编译时没有警告。
如果 Windows 专门使用 C API,则可以切换到 UTF16。使用wchar_t
代替char
,使用"宽C字符串"版本的C函数,示例wcscpy
代替strcpy
。
void get_ble_list(wchar_t **deviceNames)
{
...
wcscpy(...);
}
相关文章:
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 尝试将字符串/字符转换为整数会产生意外结果
- 为什么没有访问所有字符串字符?
- 将子字符串字符从字符串值转换为 int,然后将其分配给 int 变量
- 如何将字符串字符与结构数组进行比较?
- 将单个字符串/字符输入串行监视器
- 读取字符串字符时出错 - 对于数组中的字符串值
- C++ C 样式字符串/字符数组的大小 - 优化
- 读取字符串字符时出错
- C++ 使用 Strtok 读取字符串字符时出错
- 如何将 int 数组的 1 个元素转换为字符串/字符
- 在另一个字符串中逐个复制字符串字符
- 将字符串字符映射到矢量
- MBED RTOS将Float转换为字符串/字符阵列
- 如何使用字符串字符数组中的 ++ 运算符访问下一个字符串
- 如何比较C++中的单个字符串字符?
- 内部字符串/字符如何在 int 和 float 中存储
- 将十六进制转换为可打印的字符串/字符
- wcscpy_s后读取字符串字符时出错
- 检查字符串字符和长度