说说char

55 篇文章 0 订阅

    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来作为存储容器。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值