深入编解码:ASCII,UNICODE,UTF8等

Posted aoyihuashao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入编解码:ASCII,UNICODE,UTF8等相关的知识,希望对你有一定的参考价值。

ASCII

ASCII = American Standard Code for Information Interchange(美国信息交换标准码)

美国最先有了计算机技术,计算机里面只有01,也就是数字,要用数字代表附号,所以需要制定一张数字附号对应表。

所以美国就自己定义了一张表,也就是ascii表,用7位bit代表一个附号,最多表示128个附号。

 

Unicode

很快,其他国家的不同附号都要登场,就需要扩展附号表,起初是各个国家各自扩展,各自为政,结果混在一起就乱码,

于是就统一制定了Unicode,依次用更大的数字对应更多的附号。

最终产生了一张100多万条记录的附号表。如:4E25表示汉字

具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表

 

Unicode的机器表示

计算机最终采用的是8字节存放数据,也就是byte。

unicode这么大量的数据,需要几个字节才能表示所有的附号,

那就有问题了,当读到一个字节时,如何确定是表示一个完整的附号,还是附号中的一部分呢?

思路相当简单,就是用每个byte的前缀表示固定的含义,剩余部分拼装成Unicode值即可。

Utf-8,Utf-16,ANSI,Unicode(UCS-2 ),Big-endian,Little-endian等都是这个思路,只是格式不同罢了。

文件中字符的编码格式在文件头部的元数据中有指定:

文件的一个元数据叫BOM(byte-order mark)了,BOM位于文件二进制流的最前方,标识当前文件的编码格式。UTF16LE的BOM为FF FE,UTF16BE的BOM为FE FF,UTF8的BOM为EF BB BF,但是一般不建议UTF8文件带BOM。

 

Utf-8

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

 TF-8 的编码规则很简单,只有二条:

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

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

下面,还是以汉字为例,演示如何实现 UTF-8 编码。

的 Unicode 是4E25100111000100101),的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5

 

其他几种编码格式

1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对 Windows 简体中文版,如果是繁体中文版会采用 Big5 码)。

2)Unicode编码这里指的是notepad.exe使用的 UCS-2 编码方式,即直接用两个字节存入字符的 Unicode 码,这个选项用的 little endian 格式。

3)Unicode big endian编码与上一个选项相对应。我在下一节会解释 little endian 和 big endian 的涵义。

4)UTF-8编码,也就是上一节谈到的编码方法。

 

参考

https://www.cnblogs.com/tarol/p/7523642.html

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

以上是关于深入编解码:ASCII,UNICODE,UTF8等的主要内容,如果未能解决你的问题,请参考以下文章

Python3'ascii'编解码器无法编码字符

UnicodeDecodeError:“ascii”编解码器无法解码位置 1 的字节 0xef

字符编码-深入理解ASCII,GB2312,GBK,Unicode,UTF-8

十六进制的ASCII码 "u6cf0u56fd" 解码成unicode

Unicode ASCII UTF-8 GBK关系

什么是UTF8编码?