Attualmente sto scrivendo un plugin che è solo un wrapper attorno ad una libreria esistente. L'host del plugin mi passa una stringa formattata utf-16 definita come segueCome convertire un array ushort utf16 in un utf8 std :: string?
typedef unsigned short PA_Unichar;
E la biblioteca avvolto accetta solo un const char * o std :: string stringa UTF-8 formattato Ho provato a scrivere una funzione di conversione come
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));
}
Ma ovviamente questo non funziona, gettandomi un errore di compilazione "static_cast da 'const pointer' (aka 'const unsigned short *') a 'const char16_t *' non è consentito"
Quindi qual è il modo più elegante/corretto per farlo?
Grazie in anticipo.
Qual è il valore di 'std :: is_same :: value' sulla piattaforma? Inoltre, quale compilatore? –
moshbear
'std :: is_same :: value' ha un valore di 0 (false) e sto compilando su Mac con il compilatore Apple LLVM 4.1 anche se lo compongo anche con Visual Studio 2012 –
Robotex
Secondo http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2018.html, 'char16_t' è' uint16_least_t', non 'uint16_t'. Sulla tua piattaforma, sembra che 'uint16_least_t' sia * non * aliasato a' unsigned short', quindi 'sizeof (char16_t)! = Sizeof (unsigned short)'. 'static_cast' fallirà sui tipi di puntatore quando il' sizeof's non corrisponde. – moshbear