编码的转换
编码的转换
- 有了 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+0800到U+FFFF之间的字符(6B22在此范围内),UTF-8 使用 3 个字节来表示,格式为1110xxxx 10xxxxxx 10xxxxxx。 - 转换过程:
- 将十六进制
6B22转换为二进制:0110 1011 0010 0010 - 将这个二进制数填充到
1110xxxx 10xxxxxx 10xxxxxx的x中:1110-011010-10110010-100010 - 将这三个字节的二进制转换回十六进制:
11100110→E610101100→AC10100010→A2
- 将十六进制
- 结果:“欢”的 UTF-8 编码是
E6ACA2。
2. “欢”的 GBK 编码
GBK 是中国大陆使用的编码标准,它使用 2 个字节来表示一个汉字。
- 规则:
GBK有自己的区位码映射表。 - 转换过程:
- 直接查找
GBK编码表,找到U+6B22对应的条目。 - 根据
GBK的映射规则,码点6B22被映射为两个字节。
- 直接查找
- 结果:“欢”的
GBK编码是BBB6。
第三步:举例说明编码转换过程
假设我们有一个以 GBK 编码保存的文本文件,里面有一个“欢”字,现在需要把它转换成 UTF-8 编码。
转换过程: “欢” (GBK) → “欢” (UTF-8)
- 解码 (Decode):程序读取文件,读到 GBK 编码“欢”的两个字节
BBB6。 - 查 GBK 映射表:查询
GBK的编码表,发现BB B6这两个字节组合对应的字符是“欢”,并且这个字符的 Unicode 码点是U+6B22。 - 编码 (Encode):根据
U+6B22这个码点,去查询UTF-8的编码规则进行编码。 - 查 UTF-8 映射规则:根据
UTF-8规则,U+6B22被转换为三个字节E6ACA2。 - 写入:程序将
E6ACA2这三个字节写入到新的文件中。
编码转换的影响
- 改变了字符的二进制内容
- 在
GBK文件中,“欢”是BB B6(2 个字节)。 - 在
UTF-8文件中,“欢”是E6 AC A2(3 个字节)。 - 从磁盘上存储的
0和1来看,内容完全不同。如果你用错误的编码方式打开文件(比如用UTF-8去解读GBK的BB B6),就会得到无意义的乱码。
- 在
- 没有改变字符看上去的样子
- 尽管底层的二进制数据变了,但无论是在
GBK环境还是UTF-8环境下,屏幕显示的都是”欢“字。 - 所以,对于用户来说,“欢”还是那个“欢”,它的视觉表现没有改变。
- 尽管底层的二进制数据变了,但无论是在
总结
编码转换的本质,就是借助 Unicode 码点这个不变的“中间人”,将一个字符从一种二进制表示(如 GBK 的 BB B6)翻译成另一种二进制表示(如 UTF-8 的 E6 AC A2),而字符本身所代表的意义和视觉形象保持不变。