将 ICU Unicode 字符串转换为 std::wstring(或 wchar_t*)

Convert ICU Unicode string to std::wstring (or wchar_t*)

是否有从 icu UnicodeString 创建 std::wstring 的 icu 函数?我一直在搜索 ICU 手册,但一直找不到。

(我知道我可以将 UnicodeString 转换为 UTF8,然后转换为依赖于平台的 wchar_t* 但我正在寻找 UnicodeString 中的一个函数可以做到这一点转换。

C++ 标准没有规定 std::wstring 的任何特定编码。在 Windows 系统上,wchar_t 是 16 位,而在 Linux、macOS 和其他几个平台上,wchar_t 是 32 位。就 C++ 的 std::wstring 而言,它只是 wchar_t 的任意序列,与 std::string 只是 char.[=26 的任意序列非常相似=]

似乎 icu::UnicodeString 没有创建 std::wstring 的内置方法,但如果你真的想创建 std::wstring,你可以使用基于 C 的API u_strToWCS() 像这样:

icu::UnicodeString ustr = /* get from somewhere */;
std::wstring wstr;

int32_t requiredSize;
UErrorCode error = U_ZERO_ERROR;

// obtain the size of string we need
u_strToWCS(nullptr, 0, &requiredSize, ustr.getBuffer(), ustr.length(), &error);

// resize accordingly (this will not include any terminating null character, but it also doesn't need to either)
wstr.resize(requiredSize);

// copy the UnicodeString buffer to the std::wstring.
u_strToWCS(wstr.data(), wstr.size(), nullptr, ustr.getBuffer(), ustr.length(), &error);

据推测,u_strToWCS() 将使用最有效的方法从 UChar 转换为 wchar_t(如果它们大小相同,那么我想这只是一个简单的副本) .