目前我正在编写一个插件,它只是一个现有库的包装器。
插件的宿主向我传递一个 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' (aka 'const unsigned short*') to 'const char16_t *' is not allowed”
那么最优雅/正确的方法是什么呢?
提前感谢您。
std::is_same<unsigned short, char16_t>::value
的值是多少?另外,使用的编译器是哪个? - moshbearstd::is_same<unsigned short, char16_t>::value
的值为0(false),我正在使用苹果LLVM编译器4.1在Mac上进行编译,同时也使用Visual Studio 2012进行交叉编译。 - Robotex,因此
sizeof(char16_t) != sizeof(unsigned short)。当底层的
sizeof不匹配时,指针类型上的
static_cast`将失败。 - moshbearchar16_t
从定义上来看是16位的。如果unsigned short
用于UTF-16,那么它也必须是16位的。我要么将PA_Unicode
更改为uint16_t
,要么使用reinterpret_cast
代替static_cast
。 - Remy Lebeauchar16_t
和char32_t
类型(它们是C++11中的新类型,但是在C11中是现有类型的typedef),因此很可能库将开始使用它们。 ICU库已经支持将其构建为C++11,在这种情况下,它使用标准的charNN_t
类型。 - Jonathan Wakely