2012-05-03 16 views
5

Se voglio convertire un pezzo di stringa in UTF-16, ad esempio char * xmlbuffer, devo convertire il tipo in wchar_t * prima della codifica in UTF-16? Ed è il tipo char* reqired prima della codifica in UTF-8?wchar_t e codifica

Come è wchar_t, char legato alla UTF-8 o UTF-16 o UTF-32 o altro formato di trasformazione?

Grazie in anticipo per l'aiuto!

risposta

4

No, non è necessario modificare i tipi di dati.

Circa wchar_t: lo standard dice che

tipo wchar_t è un tipo distinto i cui valori possono rappresentare distinti codici per tutti i membri della più grande set di caratteri esteso specificato tra le localizzazioni supportate.

Sfortunatamente, non dice che cosa dovrebbe avere la codifica wchar_t; questo dipende dall'implementazione. Così, per esempio dato

auto s = L"foo"; 

si può fare assolutamente alcuna ipotesi su ciò che il valore dell'espressione *s è.

Tuttavia, è possibile utilizzare uno std::string come una sequenza opaca di byte che rappresentano il testo in qualsiasi formato di trasformazione di propria scelta senza problemi. Basta non eseguire le operazioni relative alle stringhe della libreria standard su di esso.

+0

Quindi posso dire che l'utilizzo di wchar_t per UTF-16 in piattaforma Windows è solo una questione di scelta per comodità, in teoria è possibile utilizzare in modo assoluto UTF-16? – Hunter

+0

@Hunter: In teoria si, ma in Windows, 'wchar_t' è usato per UTF-16, e' char' per ASCII e UTF-8. –

+0

Su Windows, 'wchar_t' ha una dimensione nota di 16 bit –

1

La dimensione di wchar_t dipende dal compilatore, quindi la sua relazione con i vari formati Unicode varierà.

4

iconv è una funzione POSIX che può occuparsi della fase di codifica intermedia. È possibile utilizzare iconv_open per specificare che si dispone di input UTF-8 e che si desidera l'output UTF-16. Quindi, utilizzando l'handle restituito da iconv_open, è possibile utilizzare iconv (specificando il buffer di input e il buffer di output). Quando si è fatto è necessario chiamare iconv_close sulla maniglia tornato da iconv_open a liberare risorse ecc

Si dovrà esaminare la documentazione del sistema su ciò codifiche sono supportati da iconv e il loro schema di denominazione (vale a dire quello di fornire iconv_open). Ad esempio, iconv su alcuni sistemi si aspettano "utf-8" e altri si può aspettare "UTF8" ecc

di Windows non fornisce una versione di iconv, e invece fornisce è di possedere funzioni di formattazione UTF: MultiByteToWideChar e WideCharToMultiByte.

//UTF8 to UTF16 
std::string input = ... 
int utf16len = MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
               NULL, 0); 
std::wstring output(utf16len); 
MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
           &output[0], output.size()); 
//UTF16 to UTF8 
std::wstring input = ... 
int utf8len = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
               NULL, 0, NULL, NULL); 
std::string output(utf8len); 
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
           &output[0], output.size(), NULL, NULL); 
+0

Hunter: si noti che Windows non viene fornito con iconv, ma ci sono modi per ottenerlo. @ Dreamlax: Ti dispiace se inseriamo la mia risposta nella tua come alternativa a Windows e rimuovi la mia? Il concetto di usare una libreria è quello giusto e il tuo è più chiaro a riguardo. –

+0

@MooingDuck: Sì, assolutamente, sembra una buona idea. Metti il ​​mio nel tuo o il tuo nel mio, qualunque cosa. – dreamlax

+1

@MooingDuck: Hmmm ... non suonava bene quando ho detto che ... – dreamlax