2010-06-30 8 views
8

Sto usando la libreria ICU in C++ su OS X. Tutte le mie stringhe sono UnicodeStrings, ma ho bisogno di usare chiamate di sistema come fopen, fread e così via. Queste funzioni prendono const char * o char * come argomenti. Ho letto che OS X supporta internamente l'UTF-8, quindi tutto ciò che devo fare è convertire il mio UnicodeString in UTF-8, ma non so come farlo.UnicodeString to char * (UTF-8)

UnicodeString ha una funzione membro toUTF8(), ma restituisce un ByteSink. Ho anche trovato questi esempi: http://source.icu-project.org/repos/icu/icu/trunk/source/samples/ucnv/convsamp.cpp e ho letto sull'utilizzo di un convertitore, ma sono ancora confuso. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

7

chiamare UnicodeString::extract(...) per estrarre in un char *, passare NULL per il convertitore per ottenere il convertitore predefinito (che si trova nel set di caratteri che verrà utilizzato dal sistema operativo).

+1

Grazie! Questo funziona. Non sono sicuro dell'argomento destCapacity e della lunghezza di UnicodeString. Questo codice funziona: http://codepad.org/blaSP0ex ma noterete che raddoppio manualmente il .length() di UnicodeString per recuperare la stringa multibyte. Come posso assicurarmi che ci sia spazio sufficiente nel mio char * dest? – zfedsa

+0

http://icu-project.org/apiref/icu4c/classUnicodeString.html#125255f27efd817e38806d76d9567345 Restituisce la lunghezza necessaria per la stringa di output e un U_BUFFER_OVERFLOW_ERROR nello stato se non c'era spazio sufficiente. Vedi http://userguide.icu-project.org/strings#TOC-Using-C-Strings:-NUL-Terminated-vs%2e –

+0

Grazie. La documentazione dice che è meglio indovinare la dimensione e se c'è un errore di overflow del buffer, quindi chiamare di nuovo la funzione di estrazione con la lunghezza restituita dalla prima chiamata. Lo faccio qui: http://codepad.org/nyp5yJWB ma la seconda chiamata non riesce ancora, anche se fornisco la lunghezza corretta restituita dalla prima chiamata di estrazione. Che cosa sto facendo di sbagliato? – zfedsa

3

Ciò funzionerà:

std::string utf8; 
uStr.toUTF8String(utf8); 
4

ICU User Guide > UTF-8 fornisce i metodi e le descrizioni di farlo.

Il modo più semplice per utilizzare stringhe UTF-8 in UTF-16 API avviene tramite il C++ icu::UnicodeString metodi fromUTF8(const StringPiece &utf8) e toUTF8String(StringClass &result). C'è anche toUTF8(ByteSink &sink).

E extract() non è preferibile ora.

Nota: icu::UnicodeString ha costruttori, setTo() e extract() metodi che tengano o un oggetto convertitore o un nome di set di caratteri. Questi possono essere utilizzati per UTF-8, ma non sono altrettanto efficienti o convenienti come i metodi fromUTF8()//toUTF8String() menzionati sopra.