字符编码那些事儿(UTF-8,GBK,Unicode,ASCII)(二)

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 10100010 10000001

10001000 10000001

11010000 11000100

11100101 10111111 10000011

01011111 11000011

10101011 01101000

11100111 10001110 10100101

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的编码规则。

以上内容纯属个人臆测,切不可盲目相信,后果自负哦~

 

 

 

你可能感兴趣的:(Java编程)