编码问题: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++中文输出吐槽的图片聊以慰藉一下。
- 编码问题:unicode与utf-8,wchar_t与char
- UNICODE与UTF-8 编码
- Unicode 与utf编码
- char与wchar_t的区别 ANSI Unicode
- UTF-8 与UniCode 编码转换
- Unicode 与 UTF-8 编码详解
- UTF-8编码与Unicode编码的区别与联系
- unicode与多字节工程,char与WCHAR_T转化
- UNICODE(UTF-16)与UTF-8编码的相互转换
- UNICODE(UTF-16)与UTF-8编码的相互转换
- java 字符集与编码 unicode、utf-8、utf-16、gbk
- char类型与Unicode编码
- char类型与Unicode编码
- char类型与Unicode编码
- char类型与Unicode编码
- Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK 乱码与转码问题
- Unicode 编码与UTF-8编码之间的转换
- UTF-8编码格式与Unicode编码格式学习
- 【HNOI2012】【BZOJ2732】射箭
- 解决android中软件盘弹出导致的控件位置问题
- C++学习——copy构造函数及浅拷贝和深拷贝
- qt creator 在linux系统加载动态连接库
- 解压
- 编码问题:unicode与utf-8,wchar_t与char
- Android 动画实践
- 进击的KFC:OC(六)Block
- vs2010 + opencv用自定义工具打开图片并显示
- LeetCode——Search a 2D Matrix II
- 【PAT】1099. Build A Binary Search Tree (30)
- 2015年6月美国San Diego之旅
- 黑马程序员--接口和多态
- [算法]动态规划 多重背包 二进制优化