UTF8在windows控制台乱码问题

2023-12-21 11:28:33
#include <iostream>
#include <codecvt>

std::string convertToUtf8(const std::wstring& str) {
	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> converter;
	return converter.to_bytes(str);
}
std::wstring convertToUtf16(const std::string& str) {
	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> converter;
	return converter.from_bytes(str);
}

int main(int argc, char** argv)
{
	std::wstring wstr = L"我是中国人";
	std::string str = convertToUtf8(wstr);
	std::cout << str << std::endl;

	getchar();
	return 0;
}

仅仅这么处理会导致乱码,因为控制台默认是ASCI编码,显示UTF8的编码会乱码。此时需要把UTF8转ASCI,然后在控制台显示
在这里插入图片描述

增加转码函数

#include <iostream>
#include <codecvt>
#include <Windows.h>

std::string convertToUtf8(const std::wstring& str) {
	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> converter;
	return converter.to_bytes(str);
}
std::wstring convertToUtf16(const std::string& str) {
	std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> converter;
	return converter.from_bytes(str);
}

std::wstring Utf8ToUnicode(const std::string& strUTF8)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, NULL, 0);
	if (len == 0)
	{
		return L"";
	}

	wchar_t *pRes = new wchar_t[len];
	if (pRes == NULL)
	{
		return L"";
	}

	MultiByteToWideChar(CP_UTF8, 0, strUTF8.c_str(), -1, pRes, len);
	pRes[len - 1] = L'\0';
	std::wstring result = pRes;
	delete[] pRes;

	return result;
}

std::string Utf8ToAnsi(const std::string& utf8)
{
	std::wstring wstrTemp = Utf8ToUnicode(utf8);

	LPCWCH ptr = wstrTemp.c_str();
	int size = WideCharToMultiByte(CP_ACP, 0, ptr, -1, NULL, 0, NULL, NULL);

	std::string strRet(size - 1, 0);
	int len = WideCharToMultiByte(CP_ACP, 0, ptr, -1, (LPSTR)strRet.c_str(), size, NULL, NULL);

	return strRet;
}

int main(int argc, char** argv)
{
	std::wstring wstr = L"我是中国人";
	std::string str = Utf8ToAnsi(convertToUtf8(wstr));
	std::cout << str << std::endl;

	getchar();
	return 0;

}

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_23350817/article/details/135123375
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。