UTF8 символьный массив в std :: wstring - PullRequest
0 голосов
/ 06 ноября 2018

Я просто пытаюсь получить заголовок окна x11 и сохранить его в std :: wstring. Я использую такую ​​команду, чтобы получить заголовок

auto req_title = xcb_get_property(conn, 0, window, XCB_ATOM_WM_NAME, XCB_GET_PROPERTY_TYPE_ANY, 0, 100);
auto res_title = xcb_get_property_reply(conn, req_title, nullptr);

После этого я могу получить заголовок, сохраненный в массиве символов. Как я могу преобразовать этот массив в wstring?

1 Ответ

0 голосов
/ 06 ноября 2018

Текущее решение

Вы можете использовать std::wstring_convert для преобразования string в или из wstring, используя codecvt для указания преобразования в быть выполненным.

Пример использования:

string so=u8"Jérôme Ângle"; 
wstring st; 
wstring_convert<std::codecvt_utf8<wchar_t>,wchar_t> converter;
st = converter.from_bytes(so);

Если у вас есть c-строка (массив символов), перегрузки from_bytes() будут делать именно то, что вы хотите:

char p[]=u8"Jérôme Ângle";
wstring ws = converter.from_bytes(p);

Демоверсия

Это устойчиво?

Как отмечено в комментариях, C ++ 17 устарел codecvt и утилита wstring_convert:

Эти функции трудно использовать правильно, и есть Есть сомнения, правильно ли они указаны. Пользователи должны использовать вместо этого выделенные библиотеки обработки текста.

Кроме того, wstring основан на wchar_t, который имеет очень различную кодировку в системах Linux и Windows.

Итак, первый вопрос - спросить, зачем вообще нужен wstring, и почему бы просто не хранить utf-8 везде .

В зависимости от причин, вы можете рассмотреть возможность использования:

  • ICU и его UnicodeString для полной всесторонней поддержки юникода
  • boost.locale и to_utf или utf_to_utf для обычных задач, связанных с юникодом.
  • utf8-cpp для работы со строками utf8 способом Юникод (внимание, кажется, не поддерживается).
...