【发布时间】:2012-12-03 04:17:48
【问题描述】:
目前我正在编写一个插件,它只是一个现有库的包装器。 插件的主机传递给我一个 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));
}
但显然这不起作用,给我一个编译错误“不允许从'const指针'(又名'const unsigned short*')到'const char16_t *'的static_cast”
那么最优雅/正确的方法是什么?
提前谢谢你。
【问题讨论】:
-
std::is_same<unsigned short, char16_t>::value在您的平台上的价值是多少?另外,哪个编译器? -
std::is_same<unsigned short, char16_t >::value的值为 0 (false),我在 Mac 上使用 Apple LLVM 编译器 4.1 进行编译,但我也使用 Visual Studio 2012 进行交叉编译 -
根据open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2018.html,
char16_t是uint16_least_t,而不是uint16_t。在您的平台上,uint16_least_t看起来 不 别名为unsigned short,因此是sizeof(char16_t) != sizeof(unsigned short)。当底层sizeofs 不匹配时,static_cast将在指针类型上失败。 -
char16_t根据定义是 16 位的。如果unsigned short用于 UTF-16,那么它也必须是 16 位的。我要么将PA_Unicode更改为uint16_t,要么使用reinterpret_cast而不是static_cast。 -
在我看到答案之前,我使用了后一种方式,当然我可以替换 typedef,但由于我不维护 API,所以我不能冒每次更新时破坏代码的风险。我希望编写接口的人只使用标准类型