详解--编码(ASCII\Unicode,UTF-8\UTF-16\UTF-32)

本文主要搞清楚编码是怎么回事。

参考链接

字符集 编码方式
ASCII(American Standard Code for Information Interchange) ASCII
GB2312 GB2312
Unicode UTF-8 / UTF-16 / UTF-32

1.编码基本概念

1.1 字符

  • 字符(Character)
    • 在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息。说的简单点字符是各种文字和符号的总称
    • 一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号、一个图形符号或者控制符号等。

1.2 字符集

  • 字符集(Character Set):是指多个字符的集合。不同的字符集包含的字符个数不一样、包含的字符不一样、对字符的编码方式也不一样。
    • 当前常用字符集:
      1. ASCII 字符集
        只包含了128字符,这个字符集收录的主要字符是英文字母、阿拉伯字母和一些简单的控制字符。
      2. GB2312 字符集
        中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。
      3. GBK字符集
      4. Unicode字符集
        • ASCII码字符集,总共才能容纳256个字符,为了包含全世界各国语言的所有字符,后来就出现了Unicode字符集。
        • Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值。现在的规模可以容纳100多万个符号。
        • 比如,U+0639 表示阿拉伯字母 Ain,U+0041 表示英语的大写字母 A ,U+4E25 表示汉字“严”。
      5. GB18030字符集、Big5字符集、等等

1.3 字符编码

  • 字符编码(Character Encoding)
    字符编码是指一种映射规则根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输

    • 意义
      计算机中数据传输都是二进制的01,那么人要看二进制数据01背后的含义(即看到真正的文本信息),那么就要用到编码。
      这也就意味着 任何计算机上的文件被打开或查看都要经过一次解码,被存储或传输都要经过一次编码.

1.4 码点

  • 码点(Code Point):有些地方翻译为 码值 或 内码。
    • 是指在某个字符集中,根据某种编码规则将字符编码后得到的值。即编码时 二进制数据 和 字符集的映射关系。
      • 例:
        比如在ASCII字符集中,字母 A 经过 ASCII 编码得到的值是 65,那么 65 就是字符A在ASCII字符集中的码点。

2. 详解编码

2.1 ASCII 字符集和 ASCII 编码

详见上文参考链接

2.2 Unicode 字符集 相关编码(UTF-8 \ UTF-16 \ UTF-32)

2.2.1 了解为什么 unicode 字符集编码分 3 种

  • Unicode只是一个字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何编码如何存储。因此衍生出如下问题:
    1. 第一个问题是,如何才能区别Unicode和ASCII?
      同时计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?
    2. 第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是 0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

注意:

  1. 由上面问题衍生出如下三种编码方式,主要是 存储长度 的区别。
  2. 不同编码方式能容纳的字符个数取决于编码原理的是实现,而不是依赖于字符集的码点。

2.2.2 UTF-8 格式

  • 特点:变长的编码方式。
    它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度(UTF-8编码可以容纳2^21(为什么这么算看下面编码规则更清晰)个字符,总共200多万个字符)。

  • UTF-8 编码规则;

    1. 对于单字节的符号,字节的第一位设为 0,后面 7 位为这个符号的 unicode 码。因此对于英语字母,UTF-8编码和 ASCII 码是相同的。(对应下面一个字节)
    2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。(对应下面二三四个字节)
    • 如上UTF-8编码规则方式演示
      字节数(变长) UTF 字节数 (十六进制) 二进制 编码提示(我自定义的,为了好理解下面的例子)
      一个字节 0000 0000 0000 007F 0xxxxxxx 某字符的unicode字符码点为 7 位(二进制 x 的个数)以下的
      两个字节 0000 0080 0000 07FF 110xxxxx 10xxxxxx 某字符的 unicode 字符码点为 11 位(二进制 x 的个数)以下的
      三个字节 0000 0800 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 某字符的 unicode 字符码点为 16 位(二进制 x 的个数)以下的
      四个字节 0001 0000 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 某字符的 unicode 字符码点为 21 位(二进制 x 的个数)以下的
      • 按如上 UTF-8 编码规则示例,Unicode 字符集中 “严” 的 UTF-8 编码:
        1. 已知“严”的 unicode 是 \u4E25(100111000100101),这个可以通过在线工具查看
        2. 根据上表,可以发现 4E25(100111000100101,共 15 位二进制,满足上文三个字节的编码提示)处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的 UTF-8 编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。
        3. 然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。
          这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是 E4B8A5。

2.2.3 Unicode 中名词 UCS-2 和 UCS-4

  • Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值, 这个值称为码点(code point,也称码值)。 码点的值通常写成 U+ABCD 的格式。
    • 而文字和代码点之间的对应关系就是 UCS-2(Universal Character Set coded in 2 octets)。
      顾名思义,UCS-2 是用两个字节来表示码点,其取值范围为 U+0000~U+FFFF。
    • 为了能表示更多的文字,人们又提出了 UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。
  • 注意
    • UCS-2 和 UCS-4 只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。
    • 规定存储方式的称为UTF(Unicode Transformation Format),也就是我们提到的对于 unicode 字符集编码的 UTF8 格式以及UTF16、UTF32格式。

2.2.4 UTF-16 格式

  • 它使用两个字节来表示一个码点,完全对应于UCS-2。
    即把 UCS-2 规定的码点通过 Big Endian(大端) 或 Little Endian(小端) 方式直接保存下来。

  • 分类,UTF-16包括三种

    1. UTF-16
      UTF-16 就需要通过在文件开头以名为 BOM(Byte Order Mark)的字符来表明文件是 Big Endian 还是 Little Endian。

      • BOM为 U+FEFF 这个字符。
        其实 BOM 是个小聪明的想法。
        由于 UCS-2 没有定义 U+FEFF,因此只要出现 FF FE 或者 FE FF 这样的字节序列,就可以认为它是 U+FEFF,并且可以判断出是 Big Endian 还是 Little Endian。
    2. UTF-16BE(Big Endian)

    3. UTF-16LE(Little Endian)

  • BOM(Byte Order Mark)用来放在文档的开头告诉阅读器该文档的字节序。

    • UTF-8 不需要 BOM 来表明字节顺序,但可以用BOM来表明编码方式。
      字符 “ZERO WIDTH NO-BREAK SPACE” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是UTF-8编码了。UTF-16 才需要加 BOM。因为它是按 Unicode 顺序编码,在 BMP 范围内是二字节,需要识别是大或小字节序。

2.2.4 UTF-32 格式

  • UTF-32 用固定四个字节表示代码点,这样就可以完全表示 UCS-4 的所有代码点,而无需像 UTF-8 那样使用复杂的算法。
  • 与UTF-16 类似,UTF-32 也包括 UTF-32、UTF-32BE、UTF-32LE 三种编码,UTF-32 也同样需要BOM字符。

3. 文本编辑器怎么知道文本的编码

  • 当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。
    软件一般采用三种方式来决定文本的字符集和编码:
  1. 检测文件头标识(BOM)

     EF BB BF UTF-8
     FE FF UTF-16/UCS-2, big endian
     FF FE UTF-16/UCS-2, little endian
     FF FE 00 00 UTF-32/UCS-4, little endian.
     00 00 FE FF UTF-32/UCS-4, big-endian.
    
  2. 软件自己根据编码规则猜测当前文件的编码

  3. 提示用户自己输入当前文件的编码

myflag

by 2023.11.03 周一 晚

不积跬步无以至千里

你可能感兴趣的:(Computer,related,knowledge,unicode,编码)