Задать вопрос
@phpkoder
Web-програмист

Как коректно переобразовать тип wchar_t в string?

Пишу приложения на Visual Studio 2017 (консольное) в котором нужно преобразовать тип wchar_t в string дошёл до такого решения, вот часть кода:
WCHAR buffer[2048];
int main()
{
	setlocale(LC_ALL, "Rus");
	string path;
	GetModuleFileName(NULL, buffer, sizeof(buffer) / sizeof(buffer[0]));
	for (int i = 0; i < (sizeof(buffer) / sizeof(buffer[0])); i++) {
		path += buffer[i];
	}

Все вроде нормально, но кириллица не преобразовалась вместо русских букв какой-то мусор, как корректно преобразовать в тип string?
  • Вопрос задан
  • 5186 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Тип WCHAR зависит от настроек проекта и может быть как псевдонимом char, так и wchar_t. Широкое использование этого типа во всем проекте не рекомендуется, т.к. повсеместно вносит неопределенность.

Для хранения Unicode строк (у тебя же 2017 студия и c++17 по умолчанию) уже давно существует сразу несколько типов строк: std::wstring, std::u16string и std::u32string.

Тип std::wstring хранит символы типа wchar_t, который, в зависимости от настроек компилятора, может занимать 2 или 4 бйта. Это делает тип std::wstring столь же неоднозначным, как и WCHAR. Поэтому и были созданы типы со строгим размером символа: std::u16string и std::u32string. Сейчас рекомендуется пользоваться ими вместе с std::string.

Сам твой вопрос заключается не в преобразовании типа, т.к. это легко сделать с помощью std::transform и лямбды, а в преобразовании однобайтовой (std::string) кодировки в Unicode и обратно.

Для этого в стандартной библиотеке уже тоже есть всё нужное.
Пример кода
template< typename TCharType, typename TCharTraits, typename TStringAllocator >
inline void Convert( const std::string& source_string, std::basic_string<TCharType, TCharTraits, TStringAllocator>& dest_string )
{
	std::wstring_convert<std::codecvt_utf8_utf16<TCharType>, TCharType> converter;
	dest_string = converter.from_bytes( source_string );
}

template< typename TCharType, typename TCharTraits, typename TStringAllocator >
inline void Convert( const std::basic_string<TCharType, TCharTraits, TStringAllocator>& source_string, std::string& dest_string )
{
	std::wstring_convert<std::codecvt_utf8_utf16<TCharType>, TCharType> converter;
	dest_string = converter.to_bytes( source_string );
}


А помимо стандартной библиотеки все нужное есть еще и в WinAPI, и в C Run-Time Library.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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