【问题标题】:How can I use UTF-8 string as char* in Visual C++?如何在 Visual C++ 中使用 UTF-8 字符串作为 char*?
【发布时间】:2019-02-06 11:01:27
【问题描述】:

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

get_ble_list(char **deviceNames);

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

【问题讨论】:

  • 字符串是如何编码的? GUI 是否处理该编码?
  • 实际上处理 UTF-8 确实相当困难(到 char[] 的天真转换是行不通的)虽然我相信如果你挖掘足够长的时间你会找到一个库.见utfcpp.sourceforge.net
  • Windows API 不能很好地与 UTF-8 配合使用。您需要将其转码为 UTF-16(以 wchar_t 作为目标类型)才能对其执行任何操作(注意:转码涉及为结果分配内存并调用函数,not 转换为目标类型)。
  • @Bathsheba 不,utfcpp 在这里不会做任何有用的事情。

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


【解决方案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(...);
}

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 2012-10-28
    • 2017-09-16
    • 2017-03-04
    • 2014-02-22
    • 2016-05-20
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多