我一直在寻找这个问题已有一段时间,但总是以不同的观点结束。
我有以下UTF-32字符串:std::u32string utf32s = U"जि";
我想转换为UnicodeString:UnicodeString ustr;
我正在使用C ++中的ICU 65.1库处理Unicode字符串以进行规范化和组合,我发现以下link用非常糟糕的方式描述了字符串之间的转换。特别是以下说明:
整个字符串的转换:u_strFromUTF32()
和u_strFromUTF32()
在ustring.h
中。
访问代码点很简单,不需要任何宏。
在所有ICU转换API中使用UTF-32转换器 ucnv.h,包括后缀为“算法”的文件。
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获得?
非常感谢!
答案 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());
}