Unicode是什么编码,与ASCII的关系

Unicode是什么编码,与ASCII的关系

今天在看Python的转义字符的时候,在字符串中写\uxxxx的时候出现错误:SyntaxError:UnicodeError,于是搜了一下Unicode。

ASCII码

  • 就是用8位二进制来编码英文字母和其他字符
  • 在美国,7位就够了,最高一位是0,共128个字符。
  • 在其他国家是不够的,他们的文字和英文有出入,如法语在字母上有注音符号 é ,各个国家就决定把字节中最前面未使用的那一个位拿来使用,原来的128种状态就变成了256种状态,比如é就被编码成130。
  • 为了保持与ASCII码的兼容性,一般最高位为0时和原来的ASCII码相同,最高位为1的时候,各个国家自己给后面的位(1xxx xxxx)赋予他们国家的字符意义。
    出现问题
    不同国家对新增的128个数字赋予了不同的含义,比如说130在法语中代表了é,但是在希伯来语中却代表了一个希腊字母。
    所以这就成了不同国家有不同国家的编码方式,所以如果给你一串二进制数,想要解码,就必须知道它的编码方式,不然就会出现我们有时候看到的乱码 。

Unicode码

  • Unicode为世界上所有字符都分配了一个唯一的数字编号

  • 这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。例如:“马”的Unicode是U+9A6C。

  • Unicode是一种规定,Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。
    一种很容易想到的存储方式,是将U+9A6C直接转换为二进制存放,只需2个字节。UTF-8、UTF-16、UTF-32等,都是 Unicode编码 的一种实现方案。

1、UTF-32
将字符的Unicode编号直接转换成二进制存储。使用4个字节,即32位。

  • 由于编号是从 0x000000 到 0x10FFFF(十六进制),其实只需3个字节就够了。
  • 比如:马的Unicode为:U+9A6C,那么需要2个字节存放
  • 由于计算机在存储器中排列字节有大端方式和小端方式, UTF-32BE表示大端存放, UTF-32LE 表示小端存放。这样可以正确解释存储的多个字节。

2、UTF-16

UTF-16使用变长字节表示,使用2个或4个字节。

① 对于编号在U+0000到U+FFFF的字符(常用字符集),直接用两个字节表示。
② 编号在 U+10000到U+10FFFF之间的字符,需要用四个字节表示。

3、UTF-8
UTF-8使用变长字节表示,使用的字节个数从1到4个不等。

注:本文用于个人学习笔记,感谢参考博客。

你可能感兴趣的:(其他)