如何从utf32转换为Unicode字符串

时间:2019-10-16 11:12:05

标签: c++ string unicode type-conversion

我一直在寻找这个问题已有一段时间,但总是以不同的观点结束。

我有以下UTF-32字符串:std::u32string utf32s = U"जि"; 我想转换为UnicodeString:UnicodeString ustr;

我正在使用C ++中的ICU 65.1库处理Unicode字符串以进行规范化和组合,我发现以下link用非常糟糕的方式描述了字符串之间的转换。特别是以下说明:

  1. 整个字符串的转换:u_strFromUTF32()u_strFromUTF32()ustring.h中。

  2. 访问代码点很简单,不需要任何宏。

  3. 在所有ICU转换API中使用UTF-32转换器 ucnv.h,包括后缀为“算法”的文件。

  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 String获得?

非常感谢!

2 个答案:

答案 0 :(得分:3)

#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
जि

答案 1 :(得分:2)

您可能应该使用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());
}
相关问题