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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章