Чистый способ использования mbstowcs
- вызвать его дважды, чтобы узнать длину результата:
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;
Не забудьте позвонить setlocale(LC_CTYPE, "");
в начале вашей программы!
Преимущество перед Windows MultiByteToWideChar
состоит в том, что это полностью стандартный C, хотя в Windows вы все равно можете предпочесть функцию Windows API.
Я обычно заключаю этот метод вместе с противоположным в две функции преобразования string
-> wstring
и wstring
-> string
. Если вы также добавите тривиальные перегрузки string
-> string
и wstring
-> wstring
, вы можете легко написать код, который компилируется с typedef Winapi TCHAR
в любой настройке.
[ Edit: ] Я добавил нулевую инициализацию к buf
, на случай, если вы планируете использовать массив C напрямую. Я обычно возвращал бы результат как std::wstring(buf, wn)
, но остерегайтесь, если вы планируете использовать массивы с нулевым символом в конце в стиле C. [/]
В многопоточной среде вы должны передать функцию локального преобразования потока в функцию в качестве ее последнего (в настоящее время невидимого) параметра.
Вот моя маленькая напыщенная речь по этой теме.