Skip to content

Instantly share code, notes, and snippets.

@danzek
Created April 13, 2017 21:48
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danzek/d6a0e4a48a5439e7f808ed1497f6268e to your computer and use it in GitHub Desktop.
Save danzek/d6a0e4a48a5439e7f808ed1497f6268e to your computer and use it in GitHub Desktop.
Converting between wstring and string in C++
/* Retrieved from http://stackoverflow.com/a/18374698/ on April 13, 2017
* Posted by user [dk123](https://stackoverflow.com/users/1709725/dk123) on Aug 22 '13 at 7:57
* Credit given in post to user ArmanSchwarz who posted a comment with this information
*/
#include <codecvt>
// string to wstring
wstring s2ws(const std::string& str)
{
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.from_bytes(str);
}
// wstring to string
string ws2s(const std::wstring& wstr)
{
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.to_bytes(wstr);
}
@DUB1401
Copy link

DUB1401 commented Aug 30, 2022

К сожалению, в новом стандарте метод больше не работает.

'std::codecvt_utf8<wchar_t,1114111,(std::codecvt_mode)0>': warning STL4017: std::wbuffer_convert, std::wstring_convert, and the header (containing std::codecvt_mode, std::codecvt_utf8, std::codecvt_utf16, and std::codecvt_utf8_utf16) are deprecated in C++17.

@danzek
Copy link
Author

danzek commented Aug 30, 2022

My C++17 solution was to learn Rust instead :)

@DUB1401
Copy link

DUB1401 commented Sep 4, 2022

Я решил эту проблему, как для литералов (ANSI), так и для значений из текстовых файлов (UTF-8). Полностью совместимо с C++ 20. Если позволите, тут оставлю краткое решение с ссылкой на свой источник, поскольку в будущем могу добавить ещё кодировки.

std::wstring ToWstring(std::string Str) {
	std::vector<wchar_t> buf(Str.size());
	std::use_facet<std::ctype<wchar_t>>(std::locale()).widen(Str.data(),
		Str.data() + Str.size(),
		buf.data());
	return std::wstring(buf.data(), buf.size());
}
std::string ToString(std::wstring Str, Encodings FromEncoding) {
	std::string Result;
	if (FromEncoding == Encodings::UTF8) {
		std::vector<char> Bufer(Str.size());
		std::use_facet<std::ctype<wchar_t>>(std::locale()).narrow(Str.data(), Str.data() + Str.size(), '?', Bufer.data());
		Result = std::string(Bufer.data(), Bufer.size());
	}
	if (FromEncoding == Encodings::ANSI) {
		int sz = WideCharToMultiByte(CP_ACP, 0, &Str[0], (int)Str.size(), 0, 0, 0, 0);
		Result = std::string(sz, 0);
		WideCharToMultiByte(CP_ACP, 0, &Str[0], (int)Str.size(), &Result[0], sz, 0, 0);
	}
	return Result;
}

@danzek
Copy link
Author

danzek commented Sep 5, 2022

Wow, thank you! This is very helpful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment