Created
April 13, 2017 21:48
-
-
Save danzek/d6a0e4a48a5439e7f808ed1497f6268e to your computer and use it in GitHub Desktop.
Converting between wstring and string in C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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); | |
} |
My C++17 solution was to learn Rust instead :)
Я решил эту проблему, как для литералов (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;
}
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
К сожалению, в новом стандарте метод больше не работает.
'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.