char一直都在使用并且大量的使用,但是,大部分都是在单一平台上,那样没有太多的问题,在windows上大量直接使用wchar_t来解决中文的问题。并且在使用跨平台时也大多直接使用了Qt的QString来节省了很多的麻烦,但是现在项目中有不允许引入第三方库来处理字符串处理的问题,在linux直接使用char完全没有问题,而在windows上却成了乱码。为了解决这个问题,我研究了一下两个平台下char的不同。下面是我的测试代码:
char *a = "zh中";cout << "char:" << sizeof(a) << a << "[" << 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 << "[" << b[0] << b[1] << b[2] << b[3] << b[4] << "]"<< 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) << "[" <<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来作为存储容器。