• (转载)说说char


    char一直都在使用并且大量的使用,但是,大部分都是在单一平台上,那样没有太多的问题,在windows上大量直接使用wchar_t来解决中文的问题。并且在使用跨平台时也大多直接使用了Qt的QString来节省了很多的麻烦,但是现在项目中有不允许引入第三方库来处理字符串处理的问题,在linux直接使用char完全没有问题,而在windows上却成了乱码。为了解决这个问题,我研究了一下两个平台下char的不同。下面是我的测试代码:

        char *a = "zh中";
        cout << "char:" << sizeof(a) << a << "[" <<&nbsp;
                    a[0] << a[1] << a[2]  << a[3] << a[4] <<
                   "]" << endl;
        printf("%x, %x, %x, %x, %x\n", a[0], a[1], a[2], a[3], a[4]);
        wchar_t *b = L"zh中";
        cout << "wchar:" << sizeof(b) << b <<  "[" <<&nbsp;
                    b[0] << b[1] << b[2]  << b[3] << b[4] <<&nbsp;
                    "]"<< endl;
        printf("%x, %x, %x, %x, %x\n", b[0], b[1], b[2], b[3], b[4]);
        string c = "zh中";
        cout << "string:" << sizeof(c) << c <<  "[" <<
                    c.c_str()[0] << c.c_str()[1] << c.c_str()[2] <<
                    c.c_str()[3] << c.c_str()[4] << "]" << endl;
            wstring d = L"zh中";
            wcout << "wstring:" << sizeof(d) << &nbsp;"[" <<
                     d.c_str()[0] << d.c_str()[1] << d.c_str()[2] <<
                     d.c_str()[3] << d.c_str()[4] << "]" << endl;

    windows运行结果:

    linux运行结果:

    通过运行结果可以看出

    • windows和linux上英文是相同的都是ascii码.
    • 中文部分char是不同的,wchar_t是相同的。
    • b[4]已经不在是字符串的值了。每个wchar_t是占两个字节的长度。
    • wstring是使用wchar_t存储的,string是使用char来存储的。

    下面具体查看一下内存里的数据,windows下内存:

    linux下内存:

    char“中”的编码在windows下是0xd6 0xd0,查询GB2312码表刚好是"中"。在linux下是0xe4 0xb8 0xad,查询是UTF-8码表的”中“。wchar”中“的编码0x4e2d很明显是Unicode编码。

    结论:

    • vc在windows平台将char使用gb2312来存储中文。
    • gcc在linux平台将char使用utf-8来存储文本。
    • 两者都将wchar_t使用unicode来存储。
    • string使用char作为存储容器。
    • wstring使用wchar_t来作为存储容器。
  • 相关阅读:
    [置顶网]POWER 9为云与智能打造强大引擎
    [丁香医生]百亿保健帝国权健,和它阴影下的中国家庭---保存一下
    【菜鸟】RESTful 架构详解
    搞笑三问
    [置顶网] 世界服务器出货量
    [51CTO]新说MySQL事务隔离级别!
    Win2008r2 由ESXi 转换到 HyperV的处理过程
    Postgresql迁移数据文件存放位置
    极简版 卸载 home 扩充 根分区--centos7 xfs 文件格式
    CentOS下面磁盘扩容处理
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3072493.html
Copyright © 2020-2023  润新知