学习笔记: wcout输出中文

#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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值