编码的转换

编码的转换

  • 有了 Unicode 之后,每一个字符有了多种不兼容的编码方式
  • 借助 Unicode 编号可进行编码转换

编码转换过程

  • 举例:字符从 A 编码转到 B 编码
  • 找到字符的 A 编码格式
  • 通过 A 的映射表找到其 Unicode 编号
  • 通过 Unicode 编号再查 B 的映射表
  • 找到字符的 B 编码格式

编码转换详细说明

以汉字”欢“为例进行说明:

第一步:找到“欢”的 Unicode 码点

这是所有转换的中心枢纽。无论“欢”以何种方式编码,我们首先要找到它在国际标准中的“身份证号”。

通过查询 Unicode 映射表,我们得到:

  • 汉字:欢
  • Unicode 码点:U+6B22 (十六进制数)

这个 6B22 就是“欢”的通用、不变的数字表示。

第二步:查看“欢”在不同编码格式下的二进制内容

现在,我们来看不同的编码规则(映射表)如何将 U+6B22 这个码点转换成具体的二进制字节。

1. “欢”的 UTF-8 编码

UTF-8 是一种可变长度的编码,它根据 Unicode 码点的大小来决定使用 1 到 4 个字节。

  • 规则:对于码点在 U+0800U+FFFF 之间的字符(6B22 在此范围内),UTF-8 使用 3 个字节来表示,格式为 1110xxxx 10xxxxxx 10xxxxxx
  • 转换过程:
    1. 将十六进制 6B22 转换为二进制:0110 1011 0010 0010
    2. 将这个二进制数填充到 1110xxxx 10xxxxxx 10xxxxxxx 中: 1110-0110 10-101100 10-100010
    3. 将这三个字节的二进制转换回十六进制:
      • 11100110 -> E6
      • 10101100 -> AC
      • 10100010 -> A2
  • 结果:“欢”的 UTF-8 编码是 E6ACA2
2. “欢”的 GBK 编码

GBK 是中国大陆使用的编码标准,它使用 2 个字节来表示一个汉字。

  • 规则:GBK 有自己的区位码映射表。
  • 转换过程:
    1. 直接查找 GBK 编码表,找到 U+6B22 对应的条目。
    2. 根据 GBK 的映射规则,码点 6B22 被映射为两个字节。
  • 结果:“欢”的 GBK 编码是 BBB6

第三步:举例说明编码转换过程

假设我们有一个以 GBK 编码保存的文本文件,里面有一个“欢”字,现在需要把它转换成 UTF-8 编码。

转换过程: “欢” (GBK) → “欢” (UTF-8)

  1. 解码 (Decode):程序读取文件,读到 GBK 编码“欢”的两个字节 BBB6
  2. 查 GBK 映射表:查询 GBK 的编码表,发现 BB B6 这两个字节组合对应的字符是“欢”,并且这个字符的 Unicode 码点是 U+6B22
  3. 编码 (Encode):根据 U+6B22 这个码点,去查询 UTF-8 的编码规则进行编码。
  4. 查 UTF-8 映射规则:根据 UTF-8 规则, U+6B22 被转换为三个字节 E6ACA2
  5. 写入:程序将 E6ACA2 这三个字节写入到新的文件中。

编码转换的影响

  • 改变了字符的二进制内容
    • GBK 文件中,“欢”是 BB B6 (2 个字节)。
    • UTF-8 文件中,“欢”是 E6 AC A2 (3 个字节)。
    • 从磁盘上存储的 01 来看,内容完全不同。如果你用错误的编码方式打开文件(比如用 UTF-8 去解读 GBKBB B6),就会得到无意义的乱码。
  • 没有改变字符看上去的样子
    • 尽管底层的二进制数据变了,但无论是在 GBK 环境还是 UTF-8 环境下,屏幕显示的都是”欢“字。
    • 所以,对于用户来说,“欢”还是那个“欢”,它的视觉表现没有改变。

总结

编码转换的本质,就是借助 Unicode 码点这个不变的“中间人”,将一个字符从一种二进制表示(如 GBKBB B6)翻译成另一种二进制表示(如 UTF-8E6 AC A2),而字符本身所代表的意义和视觉形象保持不变。

关联文章


文章作者: huan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明来源 huan !
  目录