#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;
}
学习笔记: wcout输出中文
最新推荐文章于 2024-08-24 14:21:02 发布