Задать вопрос
CodeInside
@CodeInside

Как преобразовать string к wstring?

Что я пробовал:

Способ номер 1
std::wstring convertToWstring(const std::string& str)
{
	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
	std::wstring wtext = converter.from_bytes(str.c_str());

	return wtext;
}

Программа просто вылетает на строке std::wstring wtext = converter.from_bytes(str). Пишет "Abort has been called". При дебаге пишет " исключение Microsoft C++: std::range_error по адресу памяти 0x03E6EEC4".

Способ №2
std::wstring convertToWstring(const std::string& str)
{
	std::wstring wStr(str.begin(), str.end());

	return wStr;
}

В итоге в результирующей строке вместо кириллицы какие-то иероглифы. То есть прохожу дебагом, в str нормальные данные, а после вызова конструктора с итераторами - wstring в иероглифах.

Третий способ
std::wstring convertToWstring(const std::string& str)
{
	wchar_t* pWChr = new wchar_t[str.size()];
	size_t outSize;
	mbstowcs_s(&outSize, pWChr, str.size(), str.c_str(), str.size());

	std::wstring wStr(pWChr);
  delete[] pWChr;
	return wStr;
}

Здесь вообще своя ошибка. По этому поводу сделал скриншот. c03aedc23dfb4a14b6faaac39c6e1b10.png

Итак, кто-то может помочь в решении данной проблемы?
  • Вопрос задан
  • 4542 просмотра
Подписаться 2 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@Sumor
В первом варианте converter не создан и не инициализирован. Отсюда исключение.
Во втором варианте вы тупо подставляете байты от std::string в std::wstring. Так как в UTF-8 английские символы 1 байт, а в UTF-16 два, а в UTF-32 - четыре, а также русские буквы просто так не переводятся - вы получаете иероглифы.
В третьем варианте, в выходном буфере должно быть на один символ больше - для нуля на конце. Соответственно и sizeInWords должен быть на 1 больше. Если у вас wchar_t 4 символа, то видимо размер sizeInWords должен будет увеличится вдвое (хотя я в этом до конца не уверен).
Ответ написан
@none7
Дело не в коде, дело в компиляторе MS. Если Вы преобразуете кодировку документа в UTF-8 без BOM, то код будет(вероятно) работать как и должен. "Вероятно" потому, что даже без BOM он может догадаться, что документ в UTF-8. И тогда компилятор непременно преобразует все char[] строки из UTF-8 в системную ANSI кодировку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы