编码的转换
编码的转换
- 有了 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-0110
10-101100
10-100010
- 将这三个字节的二进制转换回十六进制:
11100110
->E6
10101100
->AC
10100010
->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
),而字符本身所代表的意义和视觉形象保持不变。