Как я могу использовать строку UTF-8 как char * в Visual C ++? - PullRequest
0 голосов
/ 31 августа 2018

Мне нужно создать библиотеку, которая будет отображать некоторые C API.

get_ble_list(char **deviceNames);

Здесь я использую другую стороннюю библиотеку, чтобы получить список устройств Bluetooth, который возвращает имя устройства как CAtlStringW. Теперь мне нужно преобразовать это в обычный массив символов C, что я могу сделать. Но когда дело дошло до символов ASCII, Unicode, я не получил ожидаемого результата. Например, я установил имя Bluetooth на своем мобильном телефоне как മലയാളം. Но я получил ??? как вывод в моем тестовом графическом приложении, которое использует мою библиотеку.

1 Ответ

0 голосов
/ 31 августа 2018

Исходная строка 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. Или выделить новый буфер для передачи. Убедитесь, что исходный код компилируется с нулевыми предупреждениями.

Вы можете переключиться на UTF16, если API-интерфейсы C используются исключительно Windows. Используйте wchar_t вместо char, используйте версию функции "широкая строка C", например wcscpy вместо strcpy.

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