В настоящее время я пишу плагин, который представляет собой просто оболочку существующей библиотеки. Хост плагина передает мне строку в формате 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 *') в 'const char16_t *' не допускается»
Итак, как это сделать наиболее элегантно / правильно?
Заранее спасибо.
std::is_same<unsigned short, char16_t>::value
на вашей платформе? Кроме того, какой компилятор? - person moshbear   schedule 15.12.2012std::is_same<unsigned short, char16_t >::value
имеет значение 0 (ложь), и я компилирую на Mac с помощью компилятора Apple LLVM 4.1, хотя я также компилирую его с помощью Visual Studio 2012. - person Robotex   schedule 15.12.2012char16_t
равноuint16_least_t
, а неuint16_t
. На вашей платформе похоже, чтоuint16_least_t
не имеет псевдонимunsigned short
, поэтомуsizeof(char16_t) != sizeof(unsigned short)
.static_cast
не будет работать с типами указателей, если базовыеsizeof
не совпадают. - person moshbear   schedule 15.12.2012char16_t
по определению является 16-битным. Еслиunsigned short
используется для UTF-16, тогда он также должен быть 16-битным. Я бы либо изменилPA_Unicode
наuint16_t
, либо использовалreinterpret_cast
вместоstatic_cast
. - person Remy Lebeau   schedule 15.12.2012char16_t
иchar32_t
(которые являются новыми, отдельными типами в C ++ 11, но определениями типов для существующих типов в C11), вероятно, библиотеки начнут их использовать. Библиотека ICU уже поддерживает сборку как C ++ 11, и в этом случае используется стандартныйcharNN_t
типы. - person Jonathan Wakely   schedule 16.12.2012