认识GBK编码和UTF-8编码

GBK编码和UTF-8编码是两种不同的字符编码方式;

1、主要区别如下:

(1)字符集范围不同:GBK编码支持中文字符和日韩字符,而UTF-8编码支持全球范围内的字符;

(2)编码方式不同:GBK编码采用双字节编码,每个字符占用2个字节,而UTF-8编码采用变长编码,一个字符的编码长度可为1-4个字节;

(3)兼容性不同:GBK编码在国内应用广泛,但在国际化应用上受到限制,而UTF-8编码具有更好的国际化兼容性;

(4)存储空间大小不同:由于GBK编码每个字符占用2个字节,因此在存储中占用的空间相对较大,而UTF-8编码采用变长编码,可以根据字符的实际长度来分配存储空间,因此在存储中占用的空间相对较小;

总之,GBK编码适用于中文和日韩语言环境,UTF-8编码适用于全球范围内的字符。

2、具体的转码示例:

(1)utf8编码转为gbk编码

std::string utf8ToGbk(const char *pszSrc)
{
	if (nullptr == pszSrc)
		return "";

	//Windows API 函数,用于将多字节字符集(如 ASCII)转换为宽字符集(如 Unicode)
	int nLen = MultiByteToWideChar(CP_UTF8, 0, pszSrc, -1, NULL, 0);
	wchar_t* pwszGBK = new wchar_t[nLen + 1];
	memset(pwszGBK, 0, nLen * 2 + 2);
	MultiByteToWideChar(CP_UTF8, 0, pszSrc, -1, pwszGBK, nLen);
	nLen = WideCharToMultiByte(CP_ACP, 0, pwszGBK, -1, NULL, 0, NULL, NULL);

	char* pszGBK = new char[nLen + 1];
	memset(pszGBK, 0, nLen + 1);
	WideCharToMultiByte(CP_ACP, 0, pwszGBK, -1, pszGBK, nLen, NULL, NULL);
	string strTemp(pszGBK);

	delete[] pwszGBK;
	pwszGBK = nullptr;

	delete[] pszGBK;
	pszGBK = nullptr;
	return strTemp;
}

(2)gbk编码转为utf8编码

std::string gbk2Utf8(std::string& strData)
{
	int nLen = MultiByteToWideChar(CP_ACP, 0, strData.c_str(), -1, NULL, 0);

	WCHAR *pWStr1 = new WCHAR[nLen];
	MultiByteToWideChar(CP_ACP, 0, strData.c_str(), -1, pWStr1, nLen);
	nLen = WideCharToMultiByte(CP_UTF8, 0, pWStr1, -1, NULL, 0, NULL, NULL);


	char *pStr2 = new char[nLen];
	WideCharToMultiByte(CP_UTF8, 0, pWStr1, -1, pStr2, nLen, NULL, NULL);

	string strOutUtf8 = pStr2;

	delete[] pWStr1;
	pWStr1 = NULL;

	delete[] pStr2;
	pStr2 = NULL;

	return strOutUtf8;
}

3、编码时也可以在VS上进行选择

注意:C++中,CString 是属于unicode的,多字节其实没法用CString的。

猜你喜欢

转载自blog.csdn.net/bigger_belief/article/details/131442841