编码问题:unicode与utf-8,wchar_t与char

来源:互联网 发布:十二宫杀手解析知乎 编辑:程序博客网 时间:2024/06/03 20:49

以前一直用C++写编程题,那些面向对象特性和一些泛性编程几乎都没有用到。现在静下心来准备仔细研读一下c++ primer。然后发现里面讲到一个wchar_t类型,两个字节的数据类型,被设计用来存储国际字符的。今天小试了一下发现不行,cout一直输出不了,然后并没有办法按照想要的处理中文wchar_t数组。在网上搜了一下,发现这里面关系到很多编码的知识。趁这次机会一起梳理下。

1.编码

大家经常看到utf-8编码,都觉得这是文字编码,然后又看到unicode编码,GBK编码等,脑子就凌乱了。这里要说一下,其实unicode和GBK才是编码的值,这与计算机其实没有什么太多的关系,完全是数学处理。而utf-8和utf-16是讨论的如何将unicode编码存储在计算机中以及如何在计算机中传输。简单来说,unicode才是编码,而utf-8是存储方式。GBK要转utf-8必须先将其转换成unicode编码,然后再讲unicode编码存储为utf-8格式才行。GBK只是对汉字的国际编码格式,其实我个人觉得并没有什么前景(自从unicode编程流行以后)。我们还是主要关注一下unicode与utf-8的关系吧。

unicode编码(16进制)   UTF-8 字节流(二进制)
0000 - 007F                0xxxxxxx
0080 - 07FF               110xxxxx 10xxxxxx
0800 - FFFF               1110xxxx 10xxxxxx 10xxxxxx

正如上面所示,在uft-8编码其实得到的字节数不确定,可能是1个字节,也可能是3个字节。但utf-8最大的好处是和ASCII码兼容,存储英文字母都是一个字节,因此现在被广泛应用。而uft-16编码就目前应用来说和unicode编码是完全一样的。其不管存储什么字符都是用2个字节。所以大家就明白了,在英文比较多的地方,我们用utf-8编码比较好,而在汉语或者其他国际字符比较多的情况下,我们用utf-16可以达到最小存储。我觉得目前编码掌握这些就可以了,其他的以后再慢慢研究吧大笑












2.大小端

在计算机存储方式中,有大端存储和小端存储。intel的cpu是小端模式,而IBM的power是大端模式。

对于大端模式:

所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

对于小端模式:

所谓的小端模式,是指数据的低位保存在内存的低地址中,而数 据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

举个列子来说,

大家都知道字符‘A’的ASCII码值为65(十进制)也就是0x41,那么这个值转换成4字节的int型在不同大小端模式的系统中存放的方式分别为:

大端模式:00 00 00 41  -----高低模式

小端模式:41 00 00 00  -----低高模式

对于一个字节内的数据,大小端是一样的,八位为00000000(高->低)

写到这里,我突然想起IEEE极限编程挑战赛的时候,有道题里面需要将char a[20]数组中的8个字节转换成unsigned long long型的,当时我是用指针处理的,讲头指针放在&a[4]上面,然后强制转换成unsigned long long型的,结果怎么都不对,然后就火了,直接循环乘暴力转换对了,不过那道题还有两个test没通过,不知道是怎么回事?大哭

现在就知道当时指针转换为什么不对了,就是小端问题,哎!!!只怪自己实力不行。

3.wchar_t型

wchar_t两个字节,是C++用来存储国际字符的数据类型,默认用unicode编码保存。不过为什么在C++中,用cout流输出不了呢?其实是cout流输出时不是用的unicode编码去读取的,而是用的系统自带的编码格式,很是麻烦,而且不同的系统设置不一样,windows是locale loc("chs");ubuntu是locale loc("zh_CN.UTF-8")

太蛋疼了,好吧,我觉得还是不要用C++处理中文了。。。尴尬具体的实现过程请各位自行百度吧,反正我是没兴趣了。还不如用java或者python3来的方便。java的char型是2个字节,python3默认编码格式是unicode,爽歪歪。C++还是用来进行高性能编程的好!!!

最后发一个对C++中文输出吐槽的图片聊以慰藉一下。











0 0