@Skodio29

Как преобразовать char* содержащий символы unicode?

Добрый день.
Есть внешняя C библиотека которая возвращает char* данные.
Например, "name":"\u0422\u0420\u0415\u041d\u0414".

Необходимо получить сконвертированные символы, т.е. на выходе иметь "name": "Флоренция".
Я пробовал преобразовывать из char* в std::string, а далее через MultiByteToWideChar в std::wstring, но это не приносит ожидаемого результата.

Работа с консолью не ведется.
Сейчас если \uXXXX нет, то char перегоняется в char16_t и отдается.
codecvt_utf8_utf16 deprecated поэтому даже не пробовал.
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 2
@dima20155
you don't choose c++. It chooses you
Если я правильно понял чего выхотите добиться, то можете попробовать данную библиотеку https://github.com/nemtrif/utfcpp
Крайне простая и компактная
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вам надо \uXXXX преобразовать в char16_t? Можно это руками делать. Берете по 6 байт из строки. Последние 4 руками преобразуете из 16ричной системы. Если символ от a до f, то прибавляете к нему 10-'a'. Если от 0 до 9 - 0-'0'.

Удобно это циклом делать, сдвигая ответ на 4 бита влево и прибавляя новый символ:
std::wstring Parse(const std::string encoded) {
  std::wstring result;
  for (int start = 0; start < encoded.length(); start += 6) {
    if (encoded[start] != '\\' || encoded[start+1] != 'u') return result // строка неправильного формата.
    char16_t nxt = 0;
    for (int i = start +2; i < start+6; ++i) {
      int cur = 0;
      char &chr = encoded[i];
      if ('0' <= chr && chr <= '9') cur = chr - '0';
      if ('a' <= chr && chr <= 'f') cur = chr - 'a' + 10;
      if ('A' <= chr && chr <= 'F') cur = chr - 'A' + 10;
      nxt = (nxt << 4) + cur;
    }
    result += nxt;
  }
  return result;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы