WINDOWS下UTF8/UTF16/ANSI相互轉換

編碼知識

代碼演示

/**
* @brief ansi字符轉UTF8字符
* @param pWideBytes 寬字符(utf16編碼)流指針
* @param cchChar 字符數,需要包含終止符數
* @param strResult 轉換結果,存儲utf8字節流
*/
std::string WideStringToUtf8(const wchar_t* pWideBytes, int cchChar)
{
	//獲取所需緩衝區大小
	int nUtf8Count = WideCharToMultiByte(CP_UTF8, 0, pWideBytes, cchChar, NULL, 0, NULL, NULL);
	if (nUtf8Count == 0)
	{
		return std::string();
	}

	//此處理解:wide char是windows對UTF16的存儲實現,
	//傳遞CP_UTF8是告訴【輸出】的字節流爲UTF8格式,
	//這樣函數內部就知道將UTF16的wide char轉化成什麼格式的字節流了
	char* pUtf8Buff = new char[nUtf8Count];
	WideCharToMultiByte(CP_UTF8, 0, pWideBytes, cchChar, pUtf8Buff, nUtf8Count, NULL, NULL);
	std::string strResult = pUtf8Buff;
	delete pUtf8Buff;
	return strResult;
}


/**
* @brief utf8字符轉寬字符(utf16編碼)
* @param nBytes 字節大小,需要包含終止符數
*/
std::wstring Utf8ToWideString(const char* pUtf8Bytes, int nBytes)
{
	//獲取所需緩衝區大小
	int nWideCount = MultiByteToWideChar(CP_UTF8, 0, pUtf8Bytes, nBytes, NULL, 0);
	if (nWideCount == 0)
	{
		return std::wstring();
	}

	//此處理解:wide char是windows對UTF16的存儲實現,
	//傳遞CP_UTF8是告訴【輸入】的字節流是UTF8格式的,
	//這樣函數內部就知道怎麼將字節流轉換成utf16的wide char格式了
	wchar_t* pWideBuff = new wchar_t[nWideCount];
	MultiByteToWideChar(CP_UTF8, 0, pUtf8Bytes, nBytes, pWideBuff, nWideCount);
	std::wstring strResult = pWideBuff;
	delete pWideBuff;

	return strResult;
}


/**
* @brief ansi字符轉寬字符(utf16編碼)
* @param nBytes 字節大小,需要包含終止符數
*/
std::wstring AnsiToWString(const char* pAnsiString, int nBytes)
{
	//獲取所需緩衝區大小
	int nWideCount = MultiByteToWideChar(CP_ACP, 0, pAnsiString, nBytes, NULL, 0);
	if (nWideCount == 0)
	{
		return std::wstring();
	}

	//此處理解:wide char是windows對UTF16的存儲實現,
	//傳遞CP_ACP是告訴【輸入】字節流是ansi格式的,
	//這樣函數內部就知道怎麼將字節流轉換成utf16的wide char格式了
	wchar_t* pWideBuff = new wchar_t[nWideCount];
	MultiByteToWideChar(CP_ACP, 0, pAnsiString, nBytes, pWideBuff, nWideCount);

	std::wstring strResult = pWideBuff;
	delete pWideBuff;
	return strResult;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章