windows下如何正确读取utf-8编码的中文

windows下如何正确读取utf-8编码的中文

问题说明

如果直接读取uft-8/uft-8-BOM的文件,在调试窗口查看其中中文变量时,发现均为乱码,可能影响后续的程序运行。

方法

在windows平台下,定义一个函数专门用于转换中文编码,从utf-8GBK

#ifdef _WIN32 // Includes both 32 bit and 64 bit
#include <windows.h>
string UTF8ToGB(const char* str)
{
  string result;
  WCHAR* strSrc;
  LPSTR szRes;

  //获得临时变量的大小
  int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
  strSrc = new WCHAR[i + 1];
  MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);

  //获得临时变量的大小
  i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
  szRes = new CHAR[i + 1];
  WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);

  result = szRes;
  delete[]strSrc;
  delete[]szRes;

  return result;
}
#else
printf("Not a Windows OS\n");
#endif
h_csv read_h_csv(string filename, char delimiter) {
  ifstream fin(filename);
  string line;
  char temp[1000];
  std::memset(temp, 0, 1000);
  if (!fin.good())
  {
    cout << "file : " << filename << "read failed!" << endl;
  }
  h_csv outvecvecstr;
  int i = 0;
  while (fin.peek() != EOF && getline(fin, line))
  {
    stringstream sin(line);
    std::vector<string> fields;
    string field;
    split(line, delimiter, fields);	//csv文件
    if (i >= 0)
    {
      std::vector<string> row_datas;
#ifdef _WIN32 // Includes both 32 bit and 64 bit
#ifdef _WIN64
      printf("Windows 64 bit\n");
      for (int ln = 0; ln < fields.size(); ln++)
      {
        row_datas.push_back(UTF8ToGB(fields[ln].c_str()));
      }
#else 
      printf("Windows 32 bit\n");
      for (int ln = 0; ln < fields.size(); ln++)
      {
        row_datas.push_back(UTF8ToGB(fields[ln].c_str()));
      }

#endif
#else
      printf("Not a Windows OS\n");
      for (int ln = 0; ln < fields.size(); ln++)
      {
        row_datas.push_back((fields[ln]));
      }
#endif

      outvecvecstr.push_back(row_datas);
    }
    if (i == -1)
    {
      std::vector<string> labels;
      std::vector<string> row_datas;
      for (int ln = 1; ln < fields.size(); ln++)
      {
        row_datas.push_back((fields[ln]));
      }
    }
    i++;
  }
  fin.close();
  return outvecvecstr;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值