From c4a5ca117c44f18aee8a1292cd39b0831169345a Mon Sep 17 00:00:00 2001 From: yinqiulai Date: Sat, 26 May 2018 21:44:45 +0800 Subject: [PATCH 1/3] =?UTF-8?q?clang=E7=BC=96=E8=AF=91=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/1/1.1.c.and.cpp | 1 + code/1/Makefile | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/1/1.1.c.and.cpp b/code/1/1.1.c.and.cpp index 837626ec..4270d60f 100644 --- a/code/1/1.1.c.and.cpp +++ b/code/1/1.1.c.and.cpp @@ -16,5 +16,6 @@ int main() { [out = std::ref(std::cout << "Result from C code: " << add(1, 2))](){ out.get() << ".\n"; }(); + getchar(); return 0; } diff --git a/code/1/Makefile b/code/1/Makefile index e0d5b00f..78dba58b 100644 --- a/code/1/Makefile +++ b/code/1/Makefile @@ -7,7 +7,7 @@ # created by changkun at changkun.de # -C = gcc +C = clang CXX = clang++ SOURCE_C = foo.c From a8662b3629de8ad9bac807efc8edf62a14ad360f Mon Sep 17 00:00:00 2001 From: yinqiulai Date: Thu, 2 Sep 2021 23:51:27 +0800 Subject: [PATCH 2/3] for backup --- something/StrHelper.cpp | 187 ++++++++++++++++++++++++++++++++++++++++ something/StrHelper.h | 19 ++++ 2 files changed, 206 insertions(+) create mode 100644 something/StrHelper.cpp create mode 100644 something/StrHelper.h diff --git a/something/StrHelper.cpp b/something/StrHelper.cpp new file mode 100644 index 00000000..42f6c87c --- /dev/null +++ b/something/StrHelper.cpp @@ -0,0 +1,187 @@ +#include "OpStrHelper.h" + +#ifdef WIN32 +#include +#endif + +#define CP_GBK (936) // 简体中文code page + +std::wstring OpStrHelper::ansi_2_wstring(const char* in) +{ + std::wstring out; + auto len = strlen(in); + +#ifdef WIN32 + //assert( _mbslen((const unsigned char*)in) == strlen(in) ); // ANSI 要求必须是纯英文 + int wbufferlen = (int)::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, in, (int)len, NULL, 0); + wchar_t* pwbuffer = new wchar_t[wbufferlen + 4]; + + wbufferlen = (int)::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, in, (int)len, pwbuffer, wbufferlen + 2); + pwbuffer[wbufferlen] = '\0'; + out.assign(pwbuffer, wbufferlen); + delete[] pwbuffer; + +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("WCHAR_T", "MS-ANSI"); + size_t out_len = (len + 1) * sizeof(wchar_t); + wchar_t* pbuffer = new wchar_t[len + 1]; + memset(pbuffer, 0, out_len); + wchar_t* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} + +std::wstring OpStrHelper::gbk_2_wstring(const char* in) +{ + std::wstring out; + auto len = strlen(in); + +#ifdef WIN32 + int wbufferlen = (int)::MultiByteToWideChar(CP_GBK, MB_PRECOMPOSED, in, (int)len, NULL, 0); + wchar_t* pwbuffer = new wchar_t[wbufferlen + 4]; + + wbufferlen = (int)::MultiByteToWideChar(CP_GBK, MB_PRECOMPOSED, in, (int)len, pwbuffer, wbufferlen + 2); + pwbuffer[wbufferlen] = '\0'; + out.assign(pwbuffer, wbufferlen); + delete[] pwbuffer; + +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("WCHAR_T", "GBK"); + size_t out_len = (len + 1) * sizeof(wchar_t); + wchar_t* pbuffer = new wchar_t[len + 1]; + memset(pbuffer, 0, out_len); + wchar_t* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} + +std::wstring OpStrHelper::utf8_2_wstring(const char* in) +{ + std::wstring out; + auto len = strlen(in); + + wchar_t* pBuf = new wchar_t[len + 1]; + + size_t out_len = (len + 1) * sizeof(wchar_t); + memset(pBuf, 0, (len + 1) * sizeof(wchar_t)); + wchar_t* pResult = pBuf; + +#ifdef WIN32 + out_len = ::MultiByteToWideChar(CP_UTF8, 0, in, len, pBuf, len * sizeof(wchar_t)); + out.assign(pResult, out_len); +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("WCHAR_T", "UTF-8"); + iconv(env, (char**)&in, (size_t*)&len, (char**)&pBuf, (size_t*)&out_len); + iconv_close(env); + out = pResult; +#endif + + delete[] pResult; + pResult = NULL; + + return out; +} + +std::string OpStrHelper::wstring_2_ansi(const wchar_t* in) +{ + std::string out; + + auto len = wcslen(in); + +#ifdef WIN32 + int bufferlen = (int)::WideCharToMultiByte(CP_ACP, 0, in, (int)len, NULL, 0, NULL, NULL); + char* pBuffer = new char[bufferlen + 4]; + + int out_len = ::WideCharToMultiByte(CP_ACP, 0, in, (int)len, pBuffer, bufferlen + 2, NULL, NULL); + pBuffer[bufferlen] = '\0'; + out.assign(pBuffer, out_len); + delete[] pBuffer; + //assert( _mbslen((const unsigned char*)out.c_str()) == strlen(out.c_str()) ); +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("MS-ANSI", "WCHAR_T"); + size_t out_len = len * 2 + 1; + size_t in_len = len * sizeof(wchar_t); + char* pbuffer = new char[out_len]; + memset(pbuffer, 0, out_len); + char* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&in_len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} + +std::string OpStrHelper::wstring_2_utf8(const wchar_t* in) +{ + std::string out; + auto len = wcslen(in); + + size_t out_len = len * 3 + 1; + char* pBuf = new char[out_len]; + + char* pResult = pBuf; + memset(pBuf, 0, out_len); + +#ifdef WIN32 + out_len = ::WideCharToMultiByte(CP_UTF8, 0, in, len, pBuf, len * 3, NULL, NULL); + out.assign(pResult, out_len); +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("UTF-8", "WCHAR_T"); + size_t in_len = len * sizeof(wchar_t); + iconv(env, (char**)&in, (size_t*)&in_len, (char**)&pBuf, (size_t*)&out_len); + + iconv_close(env); + out = pResult; +#endif + delete[] pResult; + pResult = NULL; + + return out; +} + +std::string OpStrHelper::wstring_2_gbk(const wchar_t* in) +{ + std::string out; + auto len = wcslen(in); + +#ifdef WIN32 + int bufferlen = (int)::WideCharToMultiByte(CP_GBK, 0, in, (int)len, NULL, 0, NULL, NULL); + char* pBuffer = new char[bufferlen + 4]; + + int out_len = ::WideCharToMultiByte(CP_GBK, 0, in, (int)len, pBuffer, bufferlen + 2, NULL, NULL); + pBuffer[bufferlen] = '\0'; + out.assign(pBuffer, out_len); + delete[] pBuffer; +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("GBK", "WCHAR_T"); + size_t out_len = len * 2 + 1; + size_t in_len = len * sizeof(wchar_t); + char* pbuffer = new char[out_len]; + memset(pbuffer, 0, out_len); + char* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&in_len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} \ No newline at end of file diff --git a/something/StrHelper.h b/something/StrHelper.h new file mode 100644 index 00000000..0e7742f5 --- /dev/null +++ b/something/StrHelper.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +// msvcutf-8 without bomֲ֧ ȻGBK תխַǵwstring_2_gbk +// https://www.cnblogs.com/Esfog/p/MSVC_UTF8_CHARSET_HANDLE.html + +class OpStrHelper +{ +public: + static std::wstring ansi_2_wstring(const char* in); + static std::wstring gbk_2_wstring(const char* in); + static std::wstring utf8_2_wstring(const char* in); + + static std::string wstring_2_ansi(const wchar_t* in); + static std::string wstring_2_utf8(const wchar_t* in); + static std::string wstring_2_gbk(const wchar_t* in); +}; + From ac1f854746966b05e136d1f8cf77e97550d7a174 Mon Sep 17 00:00:00 2001 From: yinqiulai Date: Thu, 2 Sep 2021 23:51:27 +0800 Subject: [PATCH 3/3] for backup --- something/StrHelper.cpp | 187 ++++++++++++++++++++++++++++++++++++++++ something/StrHelper.h | 20 +++++ 2 files changed, 207 insertions(+) create mode 100644 something/StrHelper.cpp create mode 100644 something/StrHelper.h diff --git a/something/StrHelper.cpp b/something/StrHelper.cpp new file mode 100644 index 00000000..42f6c87c --- /dev/null +++ b/something/StrHelper.cpp @@ -0,0 +1,187 @@ +#include "OpStrHelper.h" + +#ifdef WIN32 +#include +#endif + +#define CP_GBK (936) // 简体中文code page + +std::wstring OpStrHelper::ansi_2_wstring(const char* in) +{ + std::wstring out; + auto len = strlen(in); + +#ifdef WIN32 + //assert( _mbslen((const unsigned char*)in) == strlen(in) ); // ANSI 要求必须是纯英文 + int wbufferlen = (int)::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, in, (int)len, NULL, 0); + wchar_t* pwbuffer = new wchar_t[wbufferlen + 4]; + + wbufferlen = (int)::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, in, (int)len, pwbuffer, wbufferlen + 2); + pwbuffer[wbufferlen] = '\0'; + out.assign(pwbuffer, wbufferlen); + delete[] pwbuffer; + +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("WCHAR_T", "MS-ANSI"); + size_t out_len = (len + 1) * sizeof(wchar_t); + wchar_t* pbuffer = new wchar_t[len + 1]; + memset(pbuffer, 0, out_len); + wchar_t* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} + +std::wstring OpStrHelper::gbk_2_wstring(const char* in) +{ + std::wstring out; + auto len = strlen(in); + +#ifdef WIN32 + int wbufferlen = (int)::MultiByteToWideChar(CP_GBK, MB_PRECOMPOSED, in, (int)len, NULL, 0); + wchar_t* pwbuffer = new wchar_t[wbufferlen + 4]; + + wbufferlen = (int)::MultiByteToWideChar(CP_GBK, MB_PRECOMPOSED, in, (int)len, pwbuffer, wbufferlen + 2); + pwbuffer[wbufferlen] = '\0'; + out.assign(pwbuffer, wbufferlen); + delete[] pwbuffer; + +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("WCHAR_T", "GBK"); + size_t out_len = (len + 1) * sizeof(wchar_t); + wchar_t* pbuffer = new wchar_t[len + 1]; + memset(pbuffer, 0, out_len); + wchar_t* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} + +std::wstring OpStrHelper::utf8_2_wstring(const char* in) +{ + std::wstring out; + auto len = strlen(in); + + wchar_t* pBuf = new wchar_t[len + 1]; + + size_t out_len = (len + 1) * sizeof(wchar_t); + memset(pBuf, 0, (len + 1) * sizeof(wchar_t)); + wchar_t* pResult = pBuf; + +#ifdef WIN32 + out_len = ::MultiByteToWideChar(CP_UTF8, 0, in, len, pBuf, len * sizeof(wchar_t)); + out.assign(pResult, out_len); +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("WCHAR_T", "UTF-8"); + iconv(env, (char**)&in, (size_t*)&len, (char**)&pBuf, (size_t*)&out_len); + iconv_close(env); + out = pResult; +#endif + + delete[] pResult; + pResult = NULL; + + return out; +} + +std::string OpStrHelper::wstring_2_ansi(const wchar_t* in) +{ + std::string out; + + auto len = wcslen(in); + +#ifdef WIN32 + int bufferlen = (int)::WideCharToMultiByte(CP_ACP, 0, in, (int)len, NULL, 0, NULL, NULL); + char* pBuffer = new char[bufferlen + 4]; + + int out_len = ::WideCharToMultiByte(CP_ACP, 0, in, (int)len, pBuffer, bufferlen + 2, NULL, NULL); + pBuffer[bufferlen] = '\0'; + out.assign(pBuffer, out_len); + delete[] pBuffer; + //assert( _mbslen((const unsigned char*)out.c_str()) == strlen(out.c_str()) ); +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("MS-ANSI", "WCHAR_T"); + size_t out_len = len * 2 + 1; + size_t in_len = len * sizeof(wchar_t); + char* pbuffer = new char[out_len]; + memset(pbuffer, 0, out_len); + char* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&in_len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} + +std::string OpStrHelper::wstring_2_utf8(const wchar_t* in) +{ + std::string out; + auto len = wcslen(in); + + size_t out_len = len * 3 + 1; + char* pBuf = new char[out_len]; + + char* pResult = pBuf; + memset(pBuf, 0, out_len); + +#ifdef WIN32 + out_len = ::WideCharToMultiByte(CP_UTF8, 0, in, len, pBuf, len * 3, NULL, NULL); + out.assign(pResult, out_len); +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("UTF-8", "WCHAR_T"); + size_t in_len = len * sizeof(wchar_t); + iconv(env, (char**)&in, (size_t*)&in_len, (char**)&pBuf, (size_t*)&out_len); + + iconv_close(env); + out = pResult; +#endif + delete[] pResult; + pResult = NULL; + + return out; +} + +std::string OpStrHelper::wstring_2_gbk(const wchar_t* in) +{ + std::string out; + auto len = wcslen(in); + +#ifdef WIN32 + int bufferlen = (int)::WideCharToMultiByte(CP_GBK, 0, in, (int)len, NULL, 0, NULL, NULL); + char* pBuffer = new char[bufferlen + 4]; + + int out_len = ::WideCharToMultiByte(CP_GBK, 0, in, (int)len, pBuffer, bufferlen + 2, NULL, NULL); + pBuffer[bufferlen] = '\0'; + out.assign(pBuffer, out_len); + delete[] pBuffer; +#elif defined __LINUX__ + iconv_t env; + env = iconv_open("GBK", "WCHAR_T"); + size_t out_len = len * 2 + 1; + size_t in_len = len * sizeof(wchar_t); + char* pbuffer = new char[out_len]; + memset(pbuffer, 0, out_len); + char* pResult = pbuffer; + iconv(env, (char**)&in, (size_t*)&in_len, (char**)&pbuffer, (size_t*)&out_len); + iconv_close(env); + out = pResult; + delete[] pResult; +#endif + + return out; +} \ No newline at end of file diff --git a/something/StrHelper.h b/something/StrHelper.h new file mode 100644 index 00000000..1b17f0be --- /dev/null +++ b/something/StrHelper.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +// msvcutf-8 without bomֲ֧ ȻGBK תխַǵwstring_2_gbk +// https://www.cnblogs.com/Esfog/p/MSVC_UTF8_CHARSET_HANDLE.html +// https://blog.csdn.net/10km/article/details/80203286 + +class OpStrHelper +{ +public: + static std::wstring ansi_2_wstring(const char* in); + static std::wstring gbk_2_wstring(const char* in); + static std::wstring utf8_2_wstring(const char* in); + + static std::string wstring_2_ansi(const wchar_t* in); + static std::string wstring_2_utf8(const wchar_t* in); + static std::string wstring_2_gbk(const wchar_t* in); +}; +