C++ WINDOWS下 wchar_t *和char * 相互转化总结篇
說道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庫一起作為筆記
總結
以上是生活随笔為你收集整理的C++ WINDOWS下 wchar_t *和char * 相互转化总结篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编程序—将一个全是字母,以0结尾的字符
- 下一篇: 数据结构与算法——图解平衡二叉树及代码实