深入编解码: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 是4E25
(100111000100101
),严
的 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等的主要内容,如果未能解决你的问题,请参考以下文章
UnicodeDecodeError:“ascii”编解码器无法解码位置 1 的字节 0xef
字符编码-深入理解ASCII,GB2312,GBK,Unicode,UTF-8