21xrx.com
2025-04-02 08:13:24 Wednesday
文章检索 我的文章 写文章
C++遍历map输出至控制台出现乱码问题
2023-07-10 09:05:49 深夜i     17     0
C++ map 输出 乱码 控制台

在C++编程中,使用map容器存储数据非常方便,但有时输出到控制台时会出现乱码问题,特别是存储的是中文字符时。本文将介绍这个问题出现的原因,并提供几种解决方案。

出现乱码的原因是由于控制台的字符编码和程序的字符编码不一致所导致的。控制台默认的字符集编码为GB2312,而C++程序默认使用的是ASCII编码。这样一来,当程序读取map中的中文字符时,会因为编码不一致而无法正确识别,从而输出乱码。

下面是几种解决方案:

1.使用代码更改控制台字符集编码。可以使用Windows API的SetConsoleOutputCP函数实现。将控制台的字符集编码与程序中的字符集编码一致,就能够避免出现乱码。

#include <iostream>
#include <Windows.h>
#include <map>
using namespace std;
int main()
{
  //更改控制台字符集编码为UTF-8
  SetConsoleOutputCP(65001);
  //使用map存储中文字符
  map<int, string> myMap = { "你好", 2 };
  //遍历map并输出
  for (auto iter = myMap.begin(); iter != myMap.end(); iter++)
   value: " << iter->second << endl;
  
  return 0;
}

2.使用wcout输出。wcout是C++标准库提供的输出流,用于输出宽字符(Unicode)。因为宽字符是已经编码好的,所以不会出现编码不一致导致的乱码问题。

#include <iostream>
#include <map>
using namespace std;
int main()
{
  //使用map存储中文字符
  map<int, string> myMap = { 1, "世界" };
  //遍历map并输出
  for (auto iter = myMap.begin(); iter != myMap.end(); iter++)
  {
    wcout << L"key: " << iter->first << L", value: " << iter->second.c_str() << endl;
  }
  return 0;
}

3.使用boost库的locale更改字符集编码。boost库是增加了对C++标准库不足的功能的库,其中就包含了locale库。使用boost库可以更加方便地修改字符编码,从而避免输出乱码问题。

#include <iostream>
#include <boost/locale.hpp>
#include <map>
using namespace std;
using namespace boost::locale;
int main()
{
  generator gen;
  //设置locale编码为UTF-8
  locale loc = gen.generate("zh_CN.UTF-8");
  //设置程序当前locale
  std::locale::global(loc);
  //使用map存储中文字符
  map<int, string> myMap = { "你好", 2 };
  //遍历map并输出
  for (auto iter = myMap.begin(); iter != myMap.end(); iter++)
  {
    cout.imbue(loc); //更改output stream的locale
    cout << "key: " << iter->first << ", value: " << iter->second << endl;
  }
  return 0;
}

总之,以上三种方法都可以解决C++遍历map输出至控制台出现乱码问题,具体选择哪一种方法可以根据实际情况进行选择。

  
  

评论区