学习笔记: wcout输出中文

来源:互联网 发布:风机计算软件 编辑:程序博客网 时间:2024/06/04 10:15
#include "boost/locale.hpp"#include "iostream"#include "string"int main() {                     //cpp源文件,汉字的存储格式可以是utf8, ansi, ucs16等任意多种  //但是在运行时,一定是如下规则  char    zhang_gbk_D5C5[] =   "张";  //按照标准。char数组在运行时,存ansi本地编码  wchar_t zhang_ucs16_5F20[] = L"张"; //按照标准。wchar数组在运行时,存unicode本地编码        std::cout << "使用C现场打印:" << std::endl;  //成功了,这是最常用的方法  std::cout << "output cout : zhang_gbk_D5C5 = " << zhang_gbk_D5C5 << std::endl;  if (!std::cout){      std::cout.clear();  std::cout <<  "error" << std::endl;  }  //也打印出东西,但是认为zhang...变量是个整数,而不是字符串  std::cout << "output cout : zhang_ucs16_5F20 = " << zhang_ucs16_5F20 << std::endl;  if (!std::cout){      std::cout.clear();  std::cout << "error" << std::endl;  }    //失败了,而且流坏掉了,需要clear复位。  //因为流wcout需要把usc16转为本地的ansi字符集。而取本地ANSI字符编码的时,发现C现场中没说明  //因此wcout就无法做unicode->gbk的转换,就失败了。  std::wcout<< L"output wcout : zhang_ucs16_5F20 = " << zhang_ucs16_5F20 << std::endl;  if (!std::wcout){      std::wcout.clear();  std::wcout <<  "error" << std::endl;  }  //成功了!wcout居然接收string参数  std::wcout<< L"output wcout : zhang_gbk_D5C5 = " << zhang_gbk_D5C5 << std::endl;  if (!std::wcout){      std::wcout.clear();  std::wcout << "error" << std::endl;  }  std::cout << "使用本地ansi现场打印:" << std::endl;  //""字符串代表本地操作系统默认的现场,一般是chinese_republic of china.936  std::locale loc( std::locale(),"",std::locale::ctype );  std::cout.imbue(loc);  std::wcout.imbue(loc);  //仍旧成功  std::cout << "output cout : zhang_gbk_D5C5 = " << zhang_gbk_D5C5 << std::endl;  if (!std::cout){      std::cout.clear();  std::cout <<  "error" << std::endl;  }  //仍旧失败。看来cout不受locale.ctype影响  std::cout << "output cout : zhang_ucs16_5F20 = " << zhang_ucs16_5F20 << std::endl;  if (!std::cout){      std::cout.clear();  std::cout << "error" << std::endl;  }    //成功了。wcout可以根据当前locale.ctype信息,知道把unicode转gbk  std::wcout<< L"output wcout : zhang_ucs16_5F20 = " << zhang_ucs16_5F20 << std::endl;  if (!std::wcout){      std::wcout.clear();  std::wcout <<  "error" << std::endl;  }  //这次却失败了,但是流没坏掉。这个行为与wcout的行为有关,估计是用都d5cd去做转码,转失败了。  std::wcout<< L"output wcout : zhang_gbk_D5C5 = " << zhang_gbk_D5C5 << std::endl;  if (!std::wcout){      std::wcout.clear();  std::wcout << "error" << std::endl;  }  system("pause");  return 0;} 

0 0