C++(19):字符转码UTF8/Unicode/Ascii

字符转码一直是C++编程中的老大难问题,由于不同编码的规则不同,造成中文字符经常出现乱码,这里记录几个常见的字符编码之间的转换代码(C++)

UTF-8转Unicode


std::wstring Utf82Unicode(const std::string& utf8string) 
{ 
    int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0); 
    if (widesize == ERROR_NO_UNICODE_TRANSLATION) 
    { 
        throw std::exception("Invalid UTF-8 sequence."); 
    } 
    if (widesize == 0) 
    { 
        throw std::exception("Error in conversion."); 
    } 
    std::vector<wchar_t> resultstring(widesize); 
    int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize); 
    if (convresult != widesize) 
    { 
        throw std::exception("La falla!"); 
    } 
    return std::wstring(&resultstring[0]); 
} 

Unicode 转为 Ascii


string WideByte2Acsi(wstring& wstrcode) 
{ 
    int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL); 
    if (asciisize == ERROR_NO_UNICODE_TRANSLATION) 
    { 
        throw std::exception("Invalid UTF-8 sequence."); 
    } 
    if (asciisize == 0) 
    { 
        throw std::exception("Error in conversion."); 
    } 
    std::vector<char> resultstring(asciisize); 
    int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL); 
    if (convresult != asciisize) 
    { 
        throw std::exception("La falla!"); 
    } 
    return std::string(&resultstring[0]); 
}

UTF-8 转 Ascii

string UTF_82ASCII(string& strUtf8Code) 
{ 
    string strRet(""); 
    //先把 utf8 转为 unicode 
    wstring wstr = Utf82Unicode(strUtf8Code); 
    //最后把 unicode 转为 ascii 
    strRet = WideByte2Acsi(wstr); 
    return strRet; 
}

 Ascii 转 Unicode

wstring Acsi2WideByte(string& strascii)
{
	int widesize = MultiByteToWideChar(CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0);
	if (widesize == ERROR_NO_UNICODE_TRANSLATION)
	{
		throw std::exception("Invalid UTF-8 sequence.");
	}
	if (widesize == 0)
	{
		throw std::exception("Error in conversion.");
	}
	std::vector<wchar_t> resultstring(widesize);
	int convresult = MultiByteToWideChar(CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize);
	if (convresult != widesize)
	{
		throw std::exception("La falla!");
	}
	return std::wstring(&resultstring[0]);
}

Unicode 转 UTF8

std::string Unicode2Utf8(std::wstring& widestring) 
{
	using namespace std;
	int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL);
	if (utf8size == 0)
	{
		throw std::exception("Error in conversion.");
	}
	std::vector<char> resultstring(utf8size);
	int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL);
	if (convresult != utf8size)
	{
		throw std::exception("La falla!");
	}
	return std::string(&resultstring[0]);
}

Ascii 转 UTF8

string ASCII2UTF_8(string& strAsciiCode)
{
	string strRet("");
	//先把 ascii 转为 unicode 
	wstring wstr = Acsi2WideByte(strAsciiCode);
	//最后把 unicode 转为 utf8 
	strRet = Unicode2Utf8(wstr);
	return strRet;
}

参考博文:https://blog.csdn.net/u014028070/article/details/41416855

发布了85 篇原创文章 · 获赞 61 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/Leo_csdn_/article/details/100761644