字符编码问题20180619

由于计算机只能处理数字,所以要处理文本,就必须先把文本转换为数字才能被计算机处理。

最早的计算机在设计时采用了8个比特(bit)作为一个字节(byte),所以一个字节能表示的最大的整数是255(二级制11111111=十进制255),如果需要表示更大的整数,就需要更多的字节,比如两字节表示最大的整数为65535(二进制1111111111111111)。

最初在美国人发明计算机时,将128个字符被编码进计算机中,包括大小写字母、数字及一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但处理中文,一个字节是不够的,至少需要两个字节,且不能和ASCII编码冲突,故中国制定了GB2312编码,将中文编了进去。

由于全世界,有多种语言,相应存在多个编码标准,为避免发生冲突,或者在多语言混合的文本中显示出乱码,Unicode因此产生,它将所有语言都统一到一套编码中。现代操作系统和大多数编程语言都直接支持Unicode。

ASCII与Unicode的区别:

ASCII编码是1个字节,Unicode编码通常是2个字节。

汉字“中”已超出ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 001011101;Unicode编码中字母A是ASCII编码中的字母A前补0,字母A的Unicode编码是00000000 01000001,由此可见英文字母的Unicode编码比ASCII编码需要更多的储存空间,在传输和存储上十分不划算。

若统一采用Unicode编码,避免了乱码问题,但在英文传输和存储上相较ASCII编码需要更多的储存空间,故将Unicode编码转化为“可变长度字符编码”的UTF-8(8-bit Unicode Transformation Format)编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节,这样大大节省了存储空间。UTF-8是Unicode的实现方式之一。

UTF-8的编码规则:

1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码。

Unicode符号范围 UTF-8 编码方式
十六进制 二进制
0000 0000-0000 007F 0XXXXXXXX
0000 0080-0000 07FF 110XXXXX 10XXXXXX
0000 0800-0000 FFFF 1110XXXX 10XXXXXX 10XXXXXX
0001 0000-0010 FFFF 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX

比如汉字“中”的Unicode码的二进制为01001110 00101101,十六进制为4E2D,属于0000 0800-0000 FFFF范围内,转化为UTF-8二进制编码为3个字节,将汉字“中”的二进制Unicode码依次从后向前填充进三字节UTF-8二进制模板中,即11100100 10111000 10101101

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者进行传输的时候,就转换为UTF-8编码。

用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。

浏览网页时,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器,所以你看到很多网页的源码上会有类似<meta charset="UTF-8" />的信息,表示该网页正是用的UTF-8编码。



猜你喜欢

转载自blog.csdn.net/qq_42020470/article/details/80724545