01电脑真的“认识”中文吗?

我们平时会说:“电脑认识汉字。” 但更准确地说,电脑并不是像人一样看到“中”就理解“中”的意思。

电脑做的是: 按照约定,把字符对应到编号,再把编号编码成数据进行保存、传输和显示。

字符

我们看到的汉字

U+4E2D

Unicode 码点

这个字符的统一编号

E4 B8 AD

UTF-8 字节

真正保存的数据

02汉字先要有一个统一编号

中文里有大量汉字。 如果每台电脑都自己给汉字编号,不同设备之间就会乱套。

所以 Unicode 给大量字符分配统一的 码点(Code Point)

U+4E2D

汉字“中”

U+56FD

汉字“国”

U+4F60

汉字“你”

U+597D

汉字“好”

03编号怎样变成真正保存的 Byte?

Unicode 码点只是字符编号。 文件和内存真正保存的是 Byte。

UTF-8 就是一种把 Unicode 码点变成字节序列的编码方式。

U+4E2D
UTF-8 E4 B8 AD 3 Byte
E4第 1 个 Byte
B8第 2 个 Byte
AD第 3 个 Byte

在 UTF-8 中,常见汉字通常占 3 Byte。 但这不是说“汉字天生就是 3 Byte”,而是 UTF-8 对这些码点的编码结果。

04我们打拼音时,汉字是怎么出来的?

当你在键盘上输入 zhong, 键盘并不会直接产生“中”这个汉字。

中文输入法会根据你输入的按键、拼音规则、上下文和候选词模型, 给出可能的汉字或词语。

zhong

键盘输入

输入法

把按键序列转换成候选字符

候选词

05电脑怎样把“中”画到屏幕上?

电脑知道当前字符是 U+4E2D 以后, 还需要知道:这个字到底应该画成什么样?

这就需要字体(Font)。 字体中保存了字符对应的字形设计信息。

U+4E2D 字符“中”

字体

找到这个字符对应的字形

屏幕上的字形

操作系统和文字渲染系统会根据字体中的字形信息, 再结合字号、抗锯齿、屏幕像素等条件,把字画到屏幕上。

06为什么同一个汉字可以长得不一样?

因为不同字体会给同一个字符设计不同的字形。

宋体风格

笔画有明显粗细变化

黑体风格

笔画更简洁、均匀

等宽风格

常用于代码编辑器等场景

它们仍然都是同一个字符:U+4E2D

07中文乱码为什么会出现?

中文字符通常需要多个 Byte。 如果保存和读取时使用了不同编码,就很容易出现乱码。

保存时 UTF-8 E4 B8 AD
按 UTF-8 读取
按错误编码读取 乱码

过去中文环境里还使用过 GB2312、GBK、Big5 等编码。 今天 Unicode / UTF-8 已经非常普遍,但旧文件和旧系统仍可能使用其他编码。

你已经知道了什么

  • 电脑“认识中文”并不是像人一样理解汉字含义,而是按照字符编码规则处理数据。
  • Unicode 会给大量字符分配统一码点,例如“中”是 U+4E2D。
  • Unicode 码点不是最终存储字节,UTF-8 等编码负责把码点变成 Byte。
  • UTF-8 中常见汉字通常占 3 Byte,但“汉字 = 3 Byte”不是普遍规律。
  • 中文输入法负责把拼音、按键和上下文转换成候选字符,它和字符编码不是一回事。
  • 字体负责提供字符的字形,字符本身和它在屏幕上的样子不是一回事。
  • 同一个汉字在不同字体里可以长得不同,但码点仍然相同。
  • 中文乱码常常来自保存和读取时使用了不同字符编码。

下一个问题: 文字可以编码成数字, 那一张彩色图片在电脑里面到底是什么? 下一篇:一张图片在电脑里是什么?