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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值