(转载)说说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来作为存储容器。
原文地址:https://www.cnblogs.com/Robotke1/p/3072493.html