2012-12-15 14 views
6

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.

+0

Qual è il valore di 'std :: is_same :: value' sulla piattaforma? Inoltre, quale compilatore? – moshbear

+0

'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

+1

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

risposta

2

si potrebbe convertire la stringa PA_unichar ad una serie di char16_t utilizzando il costruttore basic_string(Iterator, Iterator), quindi utilizzare il std::codecvt_utf8_utf16 aspetto come si è tentato:

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); 
} 

io penso che è di destra. Sfortunatamente non posso testarlo, poiché la mia implementazione non lo supporta ancora. Ho un'implementazione di wstring_convert che ho intenzione di includere in GCC 4.9, ma non ho un'implementazione di codecvt_utf8_utf16 per testarlo.

+0

La ringrazio molto, sembra funzionare bene e questo mi ha anche salvato da alcuni tipi di cast terribili :) – Robotex

+0

Grande, sono contento che il compilatore nella mia testa abbia avuto il tipo di controllo giusto! Non interessante, quale compilatore stai usando che supporta quelle classi? –

+0

Sto compilando con il compilatore LLVM 4.1 su sistemi basati su Mac (dopo aver impostato il flag '-std = C++ 11') e Visual Studio 2012 su sistemi Windows – Robotex

Problemi correlati