說道wchar_t和char兩個類型你們都不會陌生html
wchar_t:在windows下是Unicode 16編碼,也就是俗稱寬字節windows
char:固然就是指一個字節,在windows下面默認是gbk編碼的ide
因此在windows 下 wchar_t 轉 char也就是編碼轉化函數
直接貼出wchar_t *字符串和char *字符串的集中互轉方法ui
方法一:利用Windows的宏W2A,A2W編碼
USES_CONVERSION; char* test1 = W2A(L"我是寬字節");//轉化成默認 wchar_t* test12 = A2W("我是窄字節");
方法二:利用Windows裏的ATL裏面的類CW2A和CA2W,在轉換時候還能夠順便調整編碼,不加第二個參數就是保持GBK不變spa
std::string test3 = CW2A(L"中文字符", CP_UTF8);//通常能夠加一下第二個參數,順便切換編碼 std::wstring test4 = CA2W("中文字符");//通常不用加第二個參數
方法三:利用Windows API中的函數 WideCharToMultiByte 和 MultiByteToWideChar ,並且也是能夠帶自定義編碼轉換.net
如下函數用法: CharToWchar能夠等效於CW2A,WcharToChar能夠等效於CA2Wcode
std::wstring CharToWchar(const char* c, size_t m_encode = CP_ACP) { std::wstring str; int len = MultiByteToWideChar(m_encode, 0, c, strlen(c), NULL, 0); wchar_t* m_wchar = new wchar_t[len + 1]; MultiByteToWideChar(m_encode, 0, c, strlen(c), m_wchar, len); m_wchar[len] = '\0'; str = m_wchar; delete m_wchar; return str; } std::string WcharToChar(const wchar_t* wp, size_t m_encode = CP_ACP) { std::string str; int len = WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), NULL, 0, NULL, NULL); char *m_char = new char[len + 1]; WideCharToMultiByte(m_encode, 0, wp, wcslen(wp), m_char, len, NULL, NULL); m_char[len] = '\0'; str = m_char; delete m_char; return str; }
方法四:將使用標準C的mbstowcs方法和wcstombs方法,且配合標準C的setlocale方法,這也是利用標準庫跨平臺的作法,xml
可是過程無法直接轉成自定義的編碼,須要額外轉碼。因此在Windows平臺開發的話不推薦。
注意:方法四將留在後面的blog和iconv庫一塊兒做爲筆記
https://blog.csdn.net/lightspear/article/details/54695123