Вы можете попробовать это решение ниже. Я протестировал, он работает, обнаруживает специальные символы (пример: º ç á á) и работает в Windows XP, Windows 2000 с SP4 и более поздних версиях, Windows 7, 8, 8.1 и 10.
Используя std::wstring
вместо new wchar_t
/ delete
, мы уменьшаем проблемы с утечкой ресурсов, переполнением буфера и поврежденной кучей.
dwFlags
было установлено на MB_ERR_INVALID_CHARS
для работы в Windows 2000 с пакетом обновления 4 и более поздних версий, Windows XP. Если этот флаг не установлен, функция автоматически отбрасывает недопустимые кодовые точки.
std::wstring ConvertStringToWstring(const std::string &str)
{
if (str.empty())
{
return std::wstring();
}
int num_chars = MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, str.c_str(), str.length(), NULL, 0);
std::wstring wstrTo;
if (num_chars)
{
wstrTo.resize(num_chars);
if (MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS, str.c_str(), str.length(), &wstrTo[0], num_chars))
{
return wstrTo;
}
}
return std::wstring();
}