C++ WINDOWS下 wchar_t *和char * 相互轉化總結篇
阿新 • • 發佈:2019-01-02
說道wchar_t和char兩個型別大家都不會陌生
wchar_t:在windows下是Unicode 16編碼,也就是俗稱寬位元組
char:當然就是指一個位元組,在windows下面預設是gbk編碼的
所以在windows 下 wchar_t 轉 char也就是編碼轉化
直接貼出wchar_t *字串和char *字串的集中互轉方法
方法一:利用Windows的巨集W2A,A2W
USES_CONVERSION;
char* test1 = W2A(L"我是寬位元組");//轉化成預設
wchar_t* test12 = A2W("我是窄位元組");
方法二:利用Windows裡的ATL裡面的類CW2A和CA2W,在轉換時候還可以順便調整編碼,不加第二個引數就是保持GBK不變
std::string test3 = CW2A(L"中文字元", CP_UTF8);//一般可以加一下第二個引數,順便切換編碼
std::wstring test4 = CA2W("中文字元");//一般不用加第二個引數
方法三:利用Windows API中的函式 WideCharToMultiByte 和 MultiByteToWideChar ,而且也是可以帶自定義編碼轉換
以下函式用法: CharToWchar可以等效於CW2A,WcharToChar可以等效於CA2W
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方法,這也是利用標準庫跨平臺的做法,
但是過程沒法直接轉成自定義的編碼,需要額外轉碼。所以在Windows平臺開發的話不推薦。
注意:方法四將留在後面的blog和iconv庫一起作為筆記