文字编码系统笔记(ASCII、UNICODE、UTF-8、ANSI)

来源:互联网 发布:网络视频节目许可证 编辑:程序博客网 时间:2024/06/03 17:42
/*2017-12-17  创建人:Ruo_Xiao*/

一、ASCII

  1. 全称:American Standard Code for Information Interchange。
  2. 占用一个字节。
  3. 共可以表示128个字符,因为最前面那一位始终为0。
  4. 程序员必背:
    • 字符0的ASCII的十进制为48。
    • 字符A的ASCII的十进制为65。
    • 字符a的ASCII的十进制为97。

二、UNICODE (Universal Code)

Unicode只是一个符号集,它只规定了字符与二进制代码的对应关系,却没有规定这个二进制代码存储方式。也就是说有的字符可能占一个字节,有的可能占用2个、3个或者更多。因为计算机无法知道内存中三个字节代表是一个字符还是两个还是三个,所以最好能够统一字节数目,但是如果统一为3个字节的话,ASCII码字符对应的二进制前面两个字节都得填充0,这对存储空间是一个极大的浪费。为了解决上述问题,出现了很多unicode的很多实现方法,例如:utf-8、utf-16、utf-32。

三、UTF-8

  1. 全称:UCS Transformation Format 8bit。
  2. Unicode编码范围是:0-0x10FFFF。
  3. 这是一种占用的字节可以变长的编码方式。
  4. 这个方案的意思以8位为单位来标识文字。
  5. 编码规则如下。
    • Unicode编码(16进制)  ║ UTF-8 字节流(二进制)  
      000000 - 00007F  ║ 0xxxxxxx   
      000080 - 0007FF  ║ 110xxxxx 10xxxxxx   
      000800 - 00FFFF  ║ 1110xxxx 10xxxxxx 10xxxxxx   
      010000 - 10FFFF  ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    • 对于单字节的字符,第一位为0,其他位为unicode编码(与ASCII相同)。
    • 对于多字节(n)的字符,从左往右数,第一个字节的前n位为,第(n+1)位为0,后面的字节的前两位分别是1和0,其他各位依次填入UNICODE编码,剩余位置填0。
    • 例如:字符“人”的unicode编码为0x4eba,其二进制为100111010111010,由此可知其一共占用了16位,故UTF-8的实现方法是:1110**0100** 10**111010** 10**111010**.
    • 上述中,双星号括起来的部分为unicode编码,其他部分为UTF-8的规则位。

四、UTF-16、UTF-32

  1. 任何字符都是使用2个字节或者4个字节存储。
  2. 上述字符“人”的UTF-16的是实现方式为100111010111010。
  3. 上述字符“人”的UTF-16的是实现方式为0000000000000000100111010111010。
  4. 字节序。例如字符“人”的Unicode编码为0x4eba,那么在计算机中存储时,“4e”在前面则字节序为“Big endian”方式,“ba”在前面则字节序为“Little endian”。系统通过文本开头标志来判断该文件的编码方式,规则如下:
    EF BB BF    UTF-8
    FE FF     UTF-16/UCS-2, little endian
    FF FE     UTF-16/UCS-2, big endian
    FF FE 00 00  UTF-32/UCS-4, little endian.
    00 00 FE FF  UTF-32/UCS-4, big-endian.

五、UTF-8和UTF-16的优缺点

  1. 当字符的unicode编码是单个字节时,用UTF-8合适,因为向下兼容ASCII码,占用控件小。
  2. 当字符的unicode编码是多个字节时,用UTF-16或者UTF-32合适,因为节省空间(少去了utf-8的规则位)。
  3. utf-8容错率较低,因为在解码时需要参照字节开始位,若文件传输过程中开始位传输错误,就可能导致后面所有的位就乱码。而UTF-16和UTF-32则不会,因为不需要参照字节开始位,某一位传输错误,不影响后续字符的解码。
  4. UTF-8编码容量更大,更加灵活,可以满足现存的所有的字符的要求。UTF-16则只能编码65536个字符,使用其时不得不考虑有的字符无法编码的问题。
  5. UTF-16要考虑大小端字节序的问题,UTF-8则不用。

六、ANSI编码

不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。ANSI编码表示英文字符时用一个字节,表示中文用两个或四个字节。

阅读全文
0 0
原创粉丝点击