字符编码那些事儿(UTF-8,GBK,Unicode,ASCII)(二)
来源:互联网 发布:新破天一剑淘宝 编辑:程序博客网 时间:2024/05/20 05:57
Notepad如何确定字符编码的
为什么文字会有这么多种编码呢,其中的原因大概有很多,从计算机的角度来看,主要是存储所占的长度、是否易于编码和解码等。
为了让大家比较直观的看到不同编码对字符长度的影响,下面以字符串“abc袁心玥”为例,说明一下。新建一个txt文档,里面的内容为“abc袁心玥”,按不同的编码保存,查看文件的大小属性我们将看到以下结果。
字符集
文件大小
说明
gbk
9B
“abc”每个字符各占1B
“袁心玥”每个字符各占2B
utf-8
12B
“abc”每个字符各占1B
“袁心玥”每个字符各占3B
Unicode
14B
标志0xFFFE占2B
“abc袁心玥”每个字符各占2B
表1:“abc袁心玥”对应文件的大小
下表详细说明了每个字符在不同编码下的代码点。
字符
gbk码点
utf-8码点
Unicode码点
a
01100001
01100001
00000000 01100001
b
01100010
01100010
00000000 01100010
c
01100011
01100011
00000000 01100011
袁
11010100 10101100
11101000 1010001010000001
10001000 10000001
心
11010000 11000100
11100101 1011111110000011
01011111 11000011
玥
10101011 01101000
11100111 1000111010100101
01110011 10100101
表2:不同编码下的代码点
上面讲了那么多,其实我们对字符如何编码的兴趣不大,编码无非就是二进制数据和字符集之间的一种映射,不同的编码标准就是不同的映射方式而已。问题是如果字符写入时的编码和读取时的编码不一样了会怎样,没错:乱码。
每次遇到乱码我都会想,世界上只存在一种编码该多好!
只要计算机要存储数据,编码问题就会存在,无论是我编写这篇文章还是阅读这篇文章,编码问题都无法避免。
那么应用程序是如何确定字符编码的呢?下面结合Notepad做一下说明。
当Notepad打开一个文档a.txt的时候,txt文档里不包含任何的格式或编码相关的信息,换句话说,txt文件里面存的全部是对应文档的二进制编码(按照某个字符集)。因此当a.txt被打开时,并没有额外的信息告诉Notepad要用什么编码区解析该文档,为了要将信息展示给用户,Notepad必须要确定一种编码。于是Notepad开始猜测该文档的编码(没错,就是猜),但不是瞎猜,由于每种编码都会有各自的一些特点,当a.txt的二进制数据与某个字符集的特点吻合的较好时,就是猜中了。
当然会存在猜不中的情况,比如非要用Notepad打开一个图片,当你被满屏的乱码吓到时,请不要责怪Notepad,它真的已经尽力了。即使是要打开的文档真的是一个txt格式,Notepad也未必能能够选择出正确的编码,原因是文档可能太短,二进制数据的特征不够明显,出现了模棱两可的情况。
这里有一个例子,感兴趣的朋友可以试验一下。在Notepad中输入“联通”两个字,保存,编码方式采用ANSI(对于中文来说,就是GBK),关闭Notepad。再次打开刚才保存的文档,现在问题来了,刚才的“联通”不见了!取而代之的是类似这样的东西: (乱码),这是怎么回事呢?
原因就在于Notepad把刚才用GBK编码的“联通”当成了UTF-8编码的数据,并采用UTF-8去解析,编码方式和解码方式不一样,乱码就产生了。
“联通”二字的GBK二进制编码为:11000001 10101010 11001101 10101000
正好符合UTF-8的编码规则。
以上内容纯属个人臆测,切不可盲目相信,后果自负哦~
- 字符编码那些事儿(UTF-8,GBK,Unicode,ASCII)(二)
- 字符编码那些事儿(UTF-8,GBK,Unicode,ASCII)(一)
- 字符编码那些事儿(UTF-8,GBK,Unicode,ASCII)(三)
- 字符编码ASCII、Unicode、UTF-8、iso8859-1、GBK、GB2312
- ASCII、Unicode、GBK和UTF-8字符编码
- ASCII、Unicode、GBK和UTF-8字符编码
- 深入理解-字符编码ASCII,GB2312,GBK,Unicode,UTF-8
- 深入理解-字符编码ASCII,GB2312,GBK,Unicode,UTF-8
- Java中的字符编码(Unicode、UTF-8、UTF-16)的那些事儿
- Java中的字符编码(Unicode、UTF-8、UTF-16)的那些事儿
- 字符编码简介(ASCII,ISOXXX,GB2312,GBK,UNICODE,UTF-8)
- 关于ASCII、GBK、Unicode、UTF-8编码
- Unicode/UTF-8/GBK/ASCII 编码简介
- 也谈字符编码 ascii gb2312 gbk gb13080 unicode utf-8 utf-16 utf-32
- 字符编码学习之二,ASCII,Unicode,UTF-8编码
- 字符的编码方式 ASCII 、GBK 、UTF-8 、Unicode 、Unicode big endian
- JAVA 编码之 ASCII、Unicode、GBK和UTF-8字符编码的区别联系
- 【编码】ASCII、Unicode、GBK和UTF-8字符编码的区别联系
- 面试珠玑 微软面试题小汇
- synchronized:线程同步方法使用总结
- jquer mobile关于查找替换修改span style样式问题
- C++学习 C++中虚函数工作原理和(虚)继承类的内存占用大小计算
- PHP截取各种编码的汉字字符串
- 字符编码那些事儿(UTF-8,GBK,Unicode,ASCII)(二)
- java的数据类型
- 基于hadoop搜索引擎实践——生成倒排表文件(三)
- java学习--java回收机制
- 广告点击率预估中的特征选择
- 判断是否为手机号
- hdu 5074 Hatsune Miku(2014 鞍山现场赛)
- java 获取叶子节点
- listview定位到某一行位置