码表上没有汉字,你的名字去哪了?

汉字在电脑里的编码:字节、Unicode 与 UTF-8

第 13 期 · 2026-09-05 · 2026-10-11 修订

你的名字,那张表上查不到

先把前面的路走一遍。你在键盘上敲一个字母,电脑做两件事:查一张表,把字母换成编号;再把编号写成一串 0 和 1。那张表叫 ASCII,一共 128 个格子,装着英文字母、数字和标点。这些你在上次的电脑里根本没有字,你打的字去哪了?里已经亲手对过了,忘了可以点回去看。

现在拿出你的名字,挑第一个字,去那张表上找。找不到。128 个格子从头翻到尾,一个汉字也没有。

这你早就知道了:汉字另有一张表,厚得多。今天要拆的就是这句话。厚多少?几万个汉字,怎么塞进只有 128 格的地方?

8 个开关只有 256 个编号,汉字有几万个

先回到最里面。电脑里只有开关,8 个开关排成一排,从全关到全开,能拼出 0 到 255,一共 256 个不同的数。这个你拨过:那个游戏还开着,0 和 1 拼数字,8 个开关全扳开,它停在 255。

8 个开关一组,这一组有名字,叫字节。你在手机上看到的「还剩多少 GB」,电脑上文件的「大小」,说的都是字节,只不过一次说的是几亿个。前面几回我们一直说「8 个开关」,今天它有名字了。

为什么偏偏是 8 个一组,不是 7 个、10 个?这里没有道理,是人定的。早年的电脑,有 6 个开关一组的。1956 年,IBM 的工程师维尔纳·布赫霍尔茨(Werner Buchholz)给「一组开关」起了 byte 这个名字。到 1964 年,IBM 造了一种叫 System/360 的电脑,定下 8 个一组;这种电脑卖得太多,别家也就跟着用了。8 个正好装下 ASCII 表上的一个字母,还多一个开关。这你在阿斯克码 ASCII 碰碰乐里碰到过:7 个开关就够 128 格,最左边那个一扳,就出了表。

一个字节,256 个编号。英文字母大小写加起来 52 个,加上数字和标点,128 格就够了,还多。汉字呢?翻开《新华字典》,前面几页写着:收字一万三千多个。三百年前的《康熙字典》,收了近五万个。就算只要常用的,也是几千个。

256 个编号,几万个汉字。一个字节,装不下。

一个开关不够就排开关,一个字节不够就用几个

这个问题你其实已经解过一次。一个开关只有开和关,两种,不够用,怎么办?排一排开关。8 个开关排成一组,就有了 256 种。

现在一个字节不够,办法一模一样:用几个字节,算一个汉字。

今天你用的电脑和手机里,一个字母用一个字节,一个汉字用三个字节。三个字节就是 24 个开关,能拼出一千六百多万个编号,几万个汉字随便放。

拿一个汉字看看。「王」是全中国最多人的姓,就拿它来看。它在电脑里是三个字节:

11100111 10001110 10001011

你的名字里的字,是另外三串 0 和 1。汉字不同,三串就不同;同一个汉字,不管出现在谁的名字里,那三串都一样。

a 用一个字节 8 个开关,王用三个字节 24 个开关

字母一个字节、汉字三个字节,这不是我说说而已。你可以自己数出来。

在记事本里,你能亲手数出来

要准备的: 一台电脑,Windows 或者 Mac 都行。Windows 用自带的记事本,Mac 用自带的文本编辑。

第一步,只打一个字母。 打开记事本,只打一个小写字母 a。别按回车,别打空格,屏幕上就只有这一个字母。

第二步,存起来。 点左上角的「文件」,选「另存为」。文件名打 a,保存的位置选桌面。保存按钮旁边有一栏叫「编码」,看一眼,里面写着 UTF-8。先不用管它是什么,记住这个名字,一会儿它会再出现。点保存。

第三步,看它多大。 到桌面上找到 a 这个文件,用鼠标右键点它,选最下面的「属性」。窗口中间有一行「大小」,写着:1 字节。

第四步,只打你名字里的一个字。 回到记事本,把 a 删掉,打你名字里的第一个字。同样,别打别的。另存为,文件名就用这个字,保存到桌面。

第五步,再看它多大。 右键,属性,大小:3 字节。

做对了是这样:字母那个文件 1 字节,汉字那个 3 字节。如果你看到的是 2 或者 4,多半是打了回车或者空格,回去删干净再存一次。如果看到的数大得多,是「编码」那一栏被换成了别的,重新另存为,把它选回 UTF-8。

用 Mac 的话,步骤一样,只有两处不同。打字之前多一步:点菜单栏的「格式」,选「制作纯文本」,不然它存的不是纯文字。看大小的时候,右键点文件,选的是「显示简介」,「大小」那一行写着 3 字节。

一个字母,一个字节;你名字里的那个字,三个字节。这件事现在是你自己数出来的了。

中国先有了自己的一张表

用几个字节算一个字,只解决了「放得下」。接下来还是那个老问题:哪个编号算哪个汉字?得有一张表,而且大家得用同一张。

中国自己的第一张表是 1980 年定的。那一年,国家标准总局发布了一份标准,叫 GB 2312,第二年 5 月 1 日开始用。这张表收了 6763 个汉字,每个汉字用两个字节。为什么是 6763 个?人们把报纸、书里最常出现的字数了一遍,挑出这些,日常读写够用了。

够用,不等于全够。有些人名字里的字很少见,不在这 6763 个里,那些年他们去办证,电脑里就打不出自己的名字。一张表画到哪里,电脑就认到哪里。

后来全世界的字,放到了同一张表上:「王」是 29579 号

中国有中国的表,日本有日本的表,欧洲各国也各有各的。你在讲 ASCII 那一回已经见过这个局面:各用各的表,机器之间就鸡同鸭讲。

1991 年 10 月,一张全世界共用的表定了第一版,名字叫 Unicode,中文叫统一码。地球上的文字,一国一国地都来这张表上领编号。第二年 6 月,两万多个汉字编了进去。这张表到今天还在长,上面的汉字已经接近十万个,后来连 emoji 也在上面领了编号。

这张表怎么用,和 ASCII 那张一模一样:查表,拿编号。A 在 ASCII 表上是 65 号;「王」在 Unicode 表上,是 29579 号。你名字里的每个字也各有自己的号,都是几万上下的数。

表是从 0 号排起的。最前面 128 个号,原样照抄了 ASCII,A 还是 65。往后是欧洲各国的字母、阿拉伯文、印度的文字。汉字从 19968 号开始,一排排到几万号。emoji 排在十几万号往后。谁排得靠前、谁排得靠后,一会儿有用。

29579 号,怎么装进三个字节

拿到编号,第二步还是老规矩:写成 0 和 1。65 写出来是 01000001,8 个开关,正好一个字节。29579 写出来是:

0111001110001011

16 个 0 和 1。一个字节只有 8 个开关,装不下,得掰开放进几个字节。

可这就出了一个新麻烦。字节在电脑里是一个挨一个存的。机器读到一个字节,怎么知道它自己就是一个字,还是三个字节里的一个?要是分错了,两个字的字节串在一起,读出来就全乱了。

1992 年 9 月 2 日晚上,美国工程师肯·汤普森(Ken Thompson)和罗布·派克(Rob Pike)在新泽西一家餐馆吃饭,在餐垫纸上画的,就是这个麻烦的解法:每个字节开头,留几个开关做记号。 开头是 0,意思是「我一个人就是一个字」,剩下 7 个开关放编号,正好放得下 ASCII 的 128 个号。开头是 1110,意思是「我是三个一组的第一个」。开头是 10,意思是「我是跟在后面的」。记号占掉几个开关,剩下的才放编号。

把 29579 装进去,是这样:16 个 0 和 1 掰成三段,4 个、6 个、6 个。第一段塞在 1110 后面,成了 11100111;第二段塞在 10 后面,成了 10001110;第三段塞在 10 后面,成了 10001011。

29579 写成 16 个 0 和 1,掰成三段,各塞进一个带记号的字节

回头看前面「王」的那三串,正是它们。现在你也认得开头的记号了:第一串 1110 开头,后两串 10 开头。

这套写法有名字,就是你在记事本里见过的那个:UTF-8。它和 Unicode 各管一头:Unicode 管哪个字是几号,UTF-8 管这个号怎么写成字节。

所以一个汉字三个字节,不是给汉字单独定的规矩,是编号大小定的。一个字节去掉记号剩 7 个开关,装得下 0 到 127 号,ASCII 的字全在这里,写法和以前一模一样,全世界几十年攒下来的英文文件一个都不用改。两个字节剩 11 个开关,装到两千多号,法文、俄文的字母都在这以内。三个字节剩 16 个,装到六万多号,汉字、日文假名都在里面。四个字节装十几万号往后的,emoji 在那儿。汉字排得靠后,就要三个。你数出来的 1 和 3,就是从这顿饭上来的。

拿错了表,你的名字就成了一串怪字

现在你手里有两张表了,看看用错了会怎样。「王守闯」三个字,按 UTF-8 存下来是九个字节。要是有一台机器不知道这是 UTF-8,拿 GB 2312 那张表来读,两个字节两个字节地分:前两个一查,是「鐜」;再两个,「嬪」;再两个,「畧」;再两个,「闂」。最后剩下一个字节,落了单,谁也不是。

屏幕上就出现了:鐜嬪畧闂。你在讲 ASCII 那一回见过这个词,它叫乱码。

同一串九个字节,上面按 Unicode 表读出王守闯,下面按 GB 2312 表读出鐜嬪畧闂

字节一个没变,变的只是读它的表。同一串 0 和 1,读对了表是你的名字,读错了表是一串谁也不认识的怪字。这还是讲 ASCII 那一回的那句话:意义不在 0 和 1 里,在表上。

你多半还见过另外三个字:锟斤拷。它的来历多绕一步。电脑碰到读不出的字,会先塞一个「读不出来」的记号顶在那个位置,这个记号本身占三个字节。要是这些记号又被人拿 GB 2312 表两个两个地读,读出来就是锟、斤、拷。所以满屏锟斤拷不是电脑坏了,是两张表对不上。

所以,你的名字去哪里了

它变成了几串 0 和 1,一个汉字三个字节,写在一张全世界共用的表上。记事本里你数出来的那个 3,就是它。

现在你会数了,就再数一样东西。回到电脑桌面,随便找一张照片,右键,属性,看「大小」那一行。你名字里的一个字,3 字节;这张照片,几百万字节。都是 0 和 1,一张照片凭什么比你的名字大一百万倍?

那就是我们下次,要一起拆开看的事了。

延伸阅读:烫烫烫、短信,还有你那三串数

正文到这里就讲完了。这一段是给还想再多翻一页的你,三个小角落,都守在「一个汉字几个字节、读它用哪张表」这一层,不往深里钻。

烫烫烫:另一串读错表的字

老一点的 Windows 程序出错时,屏幕上有时会冒出一排「烫烫烫烫」。它和锟斤拷是同一回事。程序员在写程序、找毛病的时候,电脑会把还没用上的字节先填上同一个数;这个数两个两个地拿 GB 2312 表一读,正好是「烫」。所以「烫烫烫」不是谁打上去的,是一串一模一样的字节被读错了表。

一条短信为什么只能发 70 个字

你可能听大人说过,一条短信最多 70 个汉字。可换成英文,能发 160 个字母。原因和今天讲的是同一件事:短信用的写法和记事本不一样,一个汉字用两个字节,一个字母连一个字节都用不满。一条短信就那么大,装汉字就装得少。

想看你名字里那三串数

正文里我只给了「王」的三串,你名字里的字是另外三串。看它们不用装任何东西。Windows 上,在开始菜单里搜 PowerShell 打开,输入 Format-Hex,空一格,再把你桌面上那个文件拖进窗口,按回车,就能看到三个两位的数。Mac 上打开「终端」,输入 xxd,空一格,拖进文件,回车。屏幕上那三个数,每个就是一个字节,把它们换成 0 和 1,就是你名字里的那个字。

署名:王叔叔