GNU/Linux:
cmake -S . -B build && cmake --build build && ./to_wstring
Windows:
cmake -S . -B build_win -G Ninja && cmake --build build_win && .\to_wstring
| template <typename Codecvt = std::codecvt_utf8<wchar_t>> | |
| inline std::wstring to_wstring(const std::string& s) | |
| { | |
| std::wstring_convert<Codecvt> conv; | |
| return conv.from_bytes(s); | |
| } |
| build | |
| build_win | |
| to_wstring | |
| *.exe | |
| *.ilk | |
| *.pdb |
GNU/Linux:
cmake -S . -B build && cmake --build build && ./to_wstring
Windows:
cmake -S . -B build_win -G Ninja && cmake --build build_win && .\to_wstring
| cmake_minimum_required(VERSION 3.16) | |
| project( | |
| to_wstring | |
| VERSION 0.1.0 | |
| DESCRIPTION | |
| "The C++11 way to convert from string to wstring and back" | |
| HOMEPAGE_URL | |
| https://gist.github.com/phetdam/36d2312e6bd652b7a8b58260f5368d86 | |
| LANGUAGES CXX | |
| ) | |
| # technically, <codecvt> is deprecated in C++17, but sadly there isn't a | |
| # suitable standard library replacement for it yet | |
| set(CMAKE_CXX_STANDARD 17) | |
| set(CMAKE_CXX_STANDARD_REQUIRED ON) | |
| add_executable(to_wstring to_wstring.cc) | |
| set_property( | |
| TARGET to_wstring | |
| PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR} | |
| ) |
| /** | |
| * @file to_wstring.cc | |
| * @author Derek Huang | |
| * @brief The C++11 way to convert from string to wstring and back | |
| * @copyright MIT License | |
| */ | |
| #include <codecvt> | |
| #include <cstdlib> | |
| #include <locale> | |
| #include <iostream> | |
| #include <memory> | |
| namespace { | |
| /** | |
| * Return a `std::wstring` from a `std::string`. | |
| * | |
| * @tparam Codecvt `std::codecvt` facet, default `std::codecvt_utf8<wchar_t>` | |
| * | |
| * @param s `const std::string&` string to convert | |
| */ | |
| template <typename Codecvt = std::codecvt_utf8<wchar_t>> | |
| inline std::wstring to_wstring(const std::string& s) | |
| { | |
| std::wstring_convert<Codecvt> conv; | |
| return conv.from_bytes(s); | |
| } | |
| /** | |
| * Return a `std::string` from a `std::wstring`. | |
| * | |
| * @tparam Codecvt `std::codecvt` facet, default `std::codecvt_utf8<wchar_t>` | |
| * | |
| * @param ws `const std::wstring&` wide string to convert | |
| */ | |
| template <typename Codecvt = std::codecvt_utf8<wchar_t>> | |
| inline std::string from_wstring(const std::wstring& ws) | |
| { | |
| std::wstring_convert<Codecvt> conv; | |
| return conv.to_bytes(ws); | |
| } | |
| } // namespace | |
| #define PDGIST_MY_STRING "this is my string" | |
| int main() | |
| { | |
| std::cout << "to_wstring(\"" PDGIST_MY_STRING "\") -- "; | |
| if (to_wstring(PDGIST_MY_STRING) == L"" PDGIST_MY_STRING) | |
| std::cout << "success\n"; | |
| else | |
| std::cout << "failure\n"; | |
| std::cout << "to_string(L\"" PDGIST_MY_STRING "\") -- "; | |
| if (from_wstring(L"" PDGIST_MY_STRING) == PDGIST_MY_STRING) | |
| std::cout << "success" << std::endl; | |
| else | |
| std::cout << "failure" << std::endl; | |
| return EXIT_SUCCESS; | |
| } |