UTF8在windows控制台乱码问题

简介: UTF8在windows控制台乱码问题
#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;
}

相关文章
|
2月前
|
Java 开发工具 Windows
Windows环境下面启动jar包,输出的日志出现乱码的解决办法
Windows环境下面启动jar包,输出的日志出现乱码的解决办法
|
2月前
|
数据可视化 Python Windows
使用 Python 代码在 windows 控制台打印正弦三角函数
使用 Python 代码在 windows 控制台打印正弦三角函数
20 0
Windows 10 控制台cmd中文显示乱码的解决方案
Windows 10 控制台cmd中文显示乱码的解决方案
Windows 10 控制台cmd中文显示乱码的解决方案
|
5月前
|
应用服务中间件 Windows
Tomcat控制台乱码问题修复
Tomcat控制台乱码问题修复
|
6月前
|
Java Windows
springboot打成jar包,在windows上运行出现乱码
springboot打成jar包,在windows上运行出现乱码
|
10月前
|
编译器 应用服务中间件
多种方法帮你解决tomcat项目部署,idea控制台乱码问题
多种方法帮你解决tomcat项目部署,idea控制台乱码问题
146 0
|
11月前
|
Windows
WGCLOUD日常使用 - windows启动server,dos窗口显示乱码的问题处理
首先,这个乱码没有影响,忽略即可 这个是windows窗口编码导致的,不会影响程序运行,server/log下日志文件没有出现乱码,我们主要看日志文件
WGCLOUD日常使用 - windows启动server,dos窗口显示乱码的问题处理
|
12月前
|
应用服务中间件 Windows
Tomcat控制台乱码问题修复
控制台产生乱码的原因是在Tomcat 在输出日志中使用的是 UTF-8 编码,而我们中文的Windows 操作系统使用的是 GBK 编码。由于编码格式不统一,所以出现了乱码。
|
Shell 测试技术 数据安全/隐私保护
网络基础 Windows控制台下Ftp使用简介
网络基础 Windows控制台下Ftp使用简介
122 0
|
Windows
【错误记录】Windows 控制台程序编译报错 ( WINDOWS.H already included. MFC apps must not #include <Windows.h> )
【错误记录】Windows 控制台程序编译报错 ( WINDOWS.H already included. MFC apps must not #include <Windows.h> )
779 0
【错误记录】Windows 控制台程序编译报错 ( WINDOWS.H already included. MFC apps must not #include <Windows.h> )