中文编码之间的区别及C++如何读取输出中文文件



(21条消息) ISO/IEC 10646、Unicode及UTF-16、UTF-8_weixin_34256074的博客-CSDN博客

(21条消息) %s 与 %ls的区别_Alex-xt的博客-CSDN博客_%ls

(21条消息) wcout 中文输出问题_onecing的博客-CSDN博客_wcout输出中文


 

先按顺序耐心看完上面三篇,再结合下面例子分析,相信你会对中文编码有一个全面的了解

创建两个txt分别为gbk,utf8编码里面分别输入中文

#include  < iostream >
#include  <string>
#include  <fstream>
#include  <locale>
using namespace std;
int  main(int  argc, char* argv[])
{

    /*
    中文
    GB2312            D6D0CEC4
    BIG5              A4A4A4E5
    GBK               D6D0CEC4
    GB18030           D6D0CEC4
    Unicode           00004E2D00006587
    UTF-8             E4B8ADE69687
    UTF-16            BE4E2D6587
    UTF-16            LE2D4E8765
    */
    setlocale(LC_ALL, "");//c  wprintf()本地化
    std::wcout.imbue(std::locale(""));//c++  wcout本地化

    wfstream aaa("./22GBK.txt");//文本为中文
    fstream bbb("./33UTF8.txt");

    char str[] = " 中文";      //我的电脑win10本地为GBK的编码
    wchar_t wstr[] = L"中文";  //这个为UTF16编码
    string str1 = " 中文";
    string str2;
    wstring wstr1 = L"中文";
    wstring wstr2;


    aaa.imbue(std::locale(""));  //每个流都要本地化
    aaa >> wstr2;//不本地化的话只读一个字节,本地化后会读取两个
    bbb >> str2;

    /*
    wchar_t temp;
    while (aaa.get(temp))//不本地化也是只读一个字节
    {
    } 
    */

   cout  << "str:" << str << endl;
    wcout << "wstr:" << wstr << endl;
    cout  << "str1:" << str1 << endl;
    wcout << "wstr1:" << wstr1 << endl;
    wcout << "GBKwstr2:" << wstr2 << endl;//不本地化的话,两个字节中第一个字节为0x00??不会输出
    cout  << "UTF8str2:" << str2 << endl;//因为是UTF8编码,控制台是GBK的所以这个无法输出

    system("pause");
    return   0;
}

本地化前:

 

 可以看到wstring<<只读取一个字节并放到宽两个字节的wstring中

 本地化后:

 wstr2正常了

除了最后一行,其它都正常了

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值