8 #ifndef SIG_UTIL_CONVERT_HPP
9 #define SIG_UTIL_CONVERT_HPP
11 #include "../helper/container_traits.hpp"
17 #pragma warning ( disable : 4996 )
20 #if (__GLIBCXX__ || __GLIBCPP__)
21 #define SIG_USE_GLIBCPP 1
24 #if (SIG_MSVC_ENV && SIG_MSVC_VER != 140) && !(SIG_USE_GLIBCPP)
27 #define SIG_ENABLE_CODECVT 1
53 size_t mbs_size = src.length() * MB_CUR_MAX + 1;
54 if (mbs_size < 2 || src == L
"\0")
return std::string();
55 char *mbs =
new char[mbs_size];
57 #if SIG_MSVC_ENV && SIG_DEBUG_MODE
59 int error = wcstombs_s(&num, mbs, mbs_size, src.c_str(), src.length() * MB_CUR_MAX + 1);
61 int error = wcstombs(mbs, src.c_str(), src.length() * MB_CUR_MAX + 1);
63 std::string dest(mbs);
66 return error == -1 ? std::string() : dest;
87 class R =
typename impl::container_traits<C>::template rebind<std::string>,
88 typename std::enable_if<std::is_same<typename impl::container_traits<C>::value_type, std::wstring>::value>::type*& =
enabler
94 for (
auto const& str : src){
118 size_t wcs_size = src.length() + 1;
119 if (wcs_size < 2 || src ==
"\0")
return std::wstring();
120 wchar_t *wcs =
new wchar_t[wcs_size];
122 #if SIG_MSVC_ENV && SIG_DEBUG_MODE
124 int error = mbstowcs_s(&num, wcs, wcs_size, src.c_str(), src.length() + 1);
126 int error = mbstowcs(wcs, src.c_str(), src.length() + 1);
128 std::wstring dest(wcs);
130 return error == -1 ? std::wstring() : dest;
151 class R =
typename impl::container_traits<C>::template rebind<std::wstring>,
152 typename std::enable_if<std::is_same<typename impl::container_traits<C>::value_type, std::string>::value>::type*& =
enabler
158 for (
auto const& str : src){
166 #if SIG_ENABLE_CODECVT
177 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
179 return convert.from_bytes(src);
192 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;
194 return convert.to_bytes(src);
207 std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> utf32conv;
209 return utf32conv.from_bytes(src);
222 std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> utf32conv;
224 return utf32conv.to_bytes(src);
240 const int dest_size = ::MultiByteToWideChar(CP_ACP, 0, src.c_str(), -1, NULL, 0);
241 BYTE* buf =
new BYTE[dest_size * 2 + 2];
243 bool is_succeed = ::MultiByteToWideChar(CP_ACP, 0, src.c_str(), -1,
reinterpret_cast<LPWSTR
>(buf), dest_size) > 0 ?
true :
false;
244 std::u16string dest(reinterpret_cast<char16_t*>(buf));
247 return is_succeed ? dest : std::u16string();
260 LPCWSTR srcp =
reinterpret_cast<LPCWSTR
>(src.c_str());
261 const int dest_size = ::WideCharToMultiByte(CP_ACP, 0, srcp, -1, NULL, 0, NULL, NULL);
262 BYTE* buf =
new BYTE[dest_size * 2];
264 bool is_succeed = ::WideCharToMultiByte(CP_ACP, 0, srcp, -1, reinterpret_cast<LPSTR>(buf), dest_size, NULL, NULL) > 0 ?
true :
false;
265 std::string dest(reinterpret_cast<char*>(buf));
268 return is_succeed ? dest : std::string();
272 #ifdef SIG_ENABLE_CODECVT
auto utf8_to_sjis(std::string const &src) -> std::string
UTF-8 -> ShiftJIS.
auto utf32_to_utf8(std::u32string const &src) -> std::string
UTF-32 -> UTF-8.
auto utf8_to_utf32(std::string const &src) -> std::u32string
UTF-8 -> UTF-32.
auto utf16_to_sjis(std::u16string const &src) -> std::string
UTF-16 -> ShiftJIS.
auto sjis_to_utf16(std::string const &src) -> std::u16string
ShiftJIS -> UTF-16.
auto utf16_to_utf8(std::u16string const &src) -> std::string
UTF-16 -> UTF-8.
auto sjis_to_utf8(std::string const &src) -> std::string
ShiftJIS -> UTF-8.
auto utf8_to_utf16(std::string const &src) -> std::u16string
UTF-8 -> UTF-16.
auto wstr_to_str(std::wstring const &src) -> std::string
ワイド文字 -> マルチバイト文字
auto str_to_wstr(std::string const &src) -> std::wstring
マルチバイト文字 -> ワイド文字