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

Rob*_*tex 6 c++ utf-8 utf-16 c++11

目前我正在编写一个插件,它只是现有库的包装器.插件的主机向我传递了一个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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

先感谢您.

Jon*_*ely 2

您可以使用构造函数将PA_unichar字符串转换为字符串,然后按照您的尝试使用构面:char16_tbasic_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);
}
Run Code Online (Sandbox Code Playgroud)

认为这是对的。不幸的是,我无法对此进行测试,因为我的实现尚不支持它。我有一个wstring_convert计划将其包含在 GCC 4.9 中的实现,但我没有用于codecvt_utf8_utf16测试它的实现。

  • 感谢您的参与 - 我想如果竞争对手有的话,我最好完成我的 GCC 实现!我没有看到任何对这些课程的需求,我认为大多数人甚至不知道它们的存在 (2认同)