1. 程式人生 > >C++ WINDOWS下 wchar_t *和char * 相互轉化總結篇

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庫一起作為筆記