如何将utf16 ushort数组转换为utf8 std :: string?

时间:2012-12-15 09:17:03

标签: c++ utf-8 c++11 utf-16

目前我正在编写一个插件,它只是现有库的包装器。 该插件的主机向我传递了一个utf-16格式的字符串,定义如下

typedef unsigned short PA_Unichar;

包装的库只接受const char *或std :: string utf-8格式的字符串 我尝试编写像

这样的转换函数
std::string toUtf8(const PA_Unichar* data)
{
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
return std::string(convert.to_bytes(static_cast<const char16_t*>(data));
}

但显然这不起作用,抛出一个编译错误“static'cast from'const pointer'(又名'const unsigned short *')到'const char16_t *'是不允许的”

那么最优雅/正确的方法是什么?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用PA_unichar构造函数将char16_t字符串转换为basic_string(Iterator, Iterator)字符串,然后在尝试时使用std::codecvt_utf8_utf16构面:

std::string conv(const PA_unichar* str, size_t len)
{
  std::u16string s(str, str+len);
  std::wstring_convert<std::codecvt_utf8_utf16<char16_t>,char16_t> convert;
  return convert.to_bytes(s);
}

认为是对的。不幸的是我无法测试这个,因为我的实现还不支持它。我有wstring_convert的实现,我打算将其包含在GCC 4.9中,但我没有codecvt_utf8_utf16的实现来测试它。