На основании моего собственного тестирования (в Windows 8, версия 2010) mbstowcs может фактически повредить исходную строку, она работает только с кодовой страницей ANSI. Если MultiByteToWideChar / WideCharToMultiByte также может привести к повреждению строки - но они имеют тенденцию заменять символы, которые они не знают, на «?» вопросительные знаки, но mbstowcs имеет тенденцию останавливаться, когда встречает неизвестный символ и обрезает строку в этой самой точке. (Я проверил вьетнамские символы на финских окнах).
Так что предпочитайте Multi * -Windows API-функции, чем аналоговые функции ANSI C.
Кроме того, я заметил, что самый короткий способ кодирования строки из одной кодовой страницы в другую - это не вызовы API-функций MultiByteToWideChar / WideCharToMultiByte, а их аналоговые макросы ATL: W2A / A2W.
Таким образом, аналоговая функция, как упоминалось выше, звучит так:
wstring utf8toUtf16(const string & str)
{
USES_CONVERSION;
_acp = CP_UTF8;
return A2W( str.c_str() );
}
_acp объявлен в макросе USES_CONVERSION.
Или также функция, которую я часто упускаю при выполнении преобразования старых данных в новые:
string ansi2utf8( const string& s )
{
USES_CONVERSION;
_acp = CP_ACP;
wchar_t* pw = A2W( s.c_str() );
_acp = CP_UTF8;
return W2A( pw );
}
Но обратите внимание, что эти макросы используют большой стек - не используйте для циклов или рекурсивных циклов для одной и той же функции - после использования макроса W2A или A2W - лучше возвращать как можно скорее, так что стек будет освобожден от временного преобразования.