Il modo più pulito per usare mbstowcs
è chiamare due volte per trovare la lunghezza del risultato:
const char * cs = <your input char*>
size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);
// error if wn == size_t(-1)
wchar_t * buf = new wchar_t[wn + 1](); // value-initialize to 0 (see below)
wn = mbsrtowcs(buf, &cs, wn + 1, NULL);
// error if wn == size_t(-1)
assert(cs == NULL); // successful conversion
// result now in buf, return e.g. as std::wstring
delete[] buf;
Non dimenticare di chiamare setlocale(LC_CTYPE, "");
all'inizio del vostro programma!
Il vantaggio rispetto a Windows MultiByteToWideChar
è che questo è interamente C standard, anche se su Windows si potrebbe comunque preferire la funzione API di Windows.
Io di solito avvolgere questo metodo, insieme a quella opposta, in due funzioni di conversione string
->wstring
e wstring
->string
. Se si aggiungono sovraccarichi banali string
->string
e wstring
->wstring
, è possibile scrivere facilmente il codice che viene compilato con typedef Winapi TCHAR
in qualsiasi impostazione.
[Modifica:] Ho aggiunto l'inizializzazione zero a buf
, nel caso in cui si preveda di utilizzare direttamente l'array C. In genere restituirei il risultato come std::wstring(buf, wn)
, ma attenzione se si prevede di utilizzare array con terminazione null stile C. [/]
In un ambiente con multithreading è necessario passare uno stato di conversione thread-local alla funzione come il suo parametro finale (attualmente invisibile).
Ecco un mio small rant su questo argomento.
fonte
2011-07-28 12:07:40
Il motivo principale per cui qualcuno avrebbe downvote sarebbe più essere, secondo me, la mancanza di codice sorgente nella sua interrogazione. Un'immagine vale più di mille parole, e così fa un pezzo di codice. Anche un banale. – ereOn
È possibile scrivere codice che funziona con 'TCHAR', indipendentemente dall'impostazione del compilatore, è sufficiente creare l'infrastruttura corretta. In C++, sovraccaricare fa tutto il lavoro pesante per te. –
Questo C o C++ è correlato? –