Как конфертировать из utf32 в Unicode String - PullRequest
1 голос
/ 16 октября 2019

Я некоторое время искал этот вопрос, но всегда получал что-то другое.

У меня есть следующая строка UTF-32: std::u32string utf32s = U"जि"; И я хотел бы преобразовать в UnicodeString:UnicodeString ustr;

Я использую библиотеку ICU 65.1 в C ++ для работы с Unicode String для нормализации и компоновки, я нашел следующую ссылку , которая очень плохо описывает преобразование между строками,Особенно следующее описание:

  1. Преобразование целых строк: u_strFromUTF32() и u_strFromUTF32() в ustring.h.

  2. Доступ к кодовым точкамявляется тривиальным и не требует каких-либо макросов.

  3. Использование конвертера UTF-32 со всеми API преобразования ICU в ucnv.h, в том числе с суффиксом "Algorithmic".

  4. UnicodeString имеет методы fromUTF32() и toUTF32().

Альтернатива, которую я нашел, - это следующая функция шаблона:

template <typename T>
void fromUTF32(const std::u32string& source, std::basic_string<T, std::char_traits<T>, std::allocator<T>>& result)
{
    wstring_convert<codecvt_utf8_utf16<T>, T> convertor;
    result = convertor.from_bytes(source);
}

Эта функция все равно пытается не распознать UnicodeString как допустимый ввод. Более подробно, учитывая строку (wstring, string, u16string ...), как создать функцию шаблона, чтобы получить ее в виде строки Unicode?

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 16 октября 2019
#include <iostream>
#include <string>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

int main() {
  std::u32string utf32s = U"जि";
  auto ustr = UnicodeString::fromUTF32(
      reinterpret_cast<const UChar32 *>(utf32s.c_str()), utf32s.size());
  std::cout << ustr << '\n';

  return 0;
}
$ g++ u32.cpp $(icu-config --cxxflags --ldflags --ldflags-icuio)                               
$ ./a.out
जि
2 голосов
/ 16 октября 2019

Вы, вероятно, должны использовать icu::UnicodeString::fromUTF32:

icu::UnicodeString asUnicodeString(std::u32string const& s) {
    static_assert(sizeof(std::u32string::value_type) == sizeof(UChar32), "");
    static_assert(alignof(std::u32string::value_type) == alignof(UChar32), "");
    return icu::UnicodeString::fromUTF32(reinterpret_cast<UChar32 const*>(s.data()), s.size());
}
...