计算机汉字编码转换过程介绍
计算机汉字编码转换过程介绍
本文用用通俗清晰的语言,完整讲解汉字从键盘输入、二进制存储到屏幕显示的全流程,帮助初学者建立正确的字符编码认知,理解计算机处理中文的底层原理,是学习计算机基础、编程与文本处理的入门资料。
概述
计算机硬件只能表示“01”的逻辑概念,无法直接表示图片以及文字,所以我们需要一定的转换过程。
接下来我们来看下一个文字从“输入-转码存储-输出(显示/打印)”的简单流程。
首先,我们知道计算机是美国人发明的,规则是美国人定的,键盘上的按键也都是英文字母,所以编号不是你想怎么分配就怎么分配。对于英文字母的输入,键盘按键产生的扫描码经操作系统映射后得到 ASCII 码,存储字符 ‘A’ 的 ASCII 码 65(二进制 01000001)。
但是,对于汉字输入就不是这么回事了,键盘上可没有汉字对应的输入按键,我们不可能直接敲出汉字字符。于是就有了输入码、机内码、字形码的转换关系,输入码帮助我们把英文键盘按键转换成汉字字符,机内码帮助我们把汉字字符转换成二进制序列,字形码帮助我们把二进制序列输出到显示器成像。
输入码
我们模拟下汉字的输入过程。
以汉字“你好”为例:
首先,打开txt文本敲下“nihao”的拼音字母,然后输入栏会弹出多个符合条件的汉字词组,最后我们会选择相应的编号,就能实现汉字的输入。
那这过程又是如何实现的呢?
计算机领域有一句如同摩西十诫般的神圣哲言:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”。
这里我们再加一层按键字母组合和汉字的映射表,好比英汉字典,这层我们称为输入码,输入码到内码的过程就是一次查表转换操作,比如“nihao”这几个ASCII字符,大家可以随便修改映射表以及候选编号,我可以把他映射成“你好”(如下图所示)。
机内码
机内码也称内码,是字符编码最核心的部分。
机内码是字符集在计算机中实际存储、交换、通信使用的二进制编码,通过内码我们可以达到高效率的存储、传输文本的目的。我们的外码(输入码)实现了键盘按键和字符的映射转换,但是机内码是让字符真正变成了机器能读懂的二进制语言。
文本编码
文本由字符 组成(字母、汉字、数字、标点),字符是离散的、有限的,因此文本编码的核心逻辑是:给每个字符分配一个唯一的二进制编号(编码),建立 "字符→二进制" 的字典映射。
【二进制,两个核心单位,这是理解数据存储的基础:
比特(bit,小写 b):二进制的最小单位,只能表示 0 或 1,是数据的 “最小原子”。
字节(byte,大写 B):8 个比特组成 1 个字节,是“存储介质和文件系统”的基本单位。】
早期编码是ASCII,仅支持英文。
计算机诞生初期,仅用于处理英文,因此 1963 年制定了ASCII 编码(美国信息交换标准代码):
用1 个字节(8bit) 表示 1 个字符;
仅使用低 7 位(0-127),共 128 个字符,包含:大小写字母(A-Z、a-z)、数字(0-9)、标点符号、控制字符(如换行、回车);
举例:
字符 "A" → ASCII 编码65 → 二进制01000001;
字符 "0" → ASCII 编码48 → 二进制00110000;
字符 "换行" → ASCII 编码10 → 二进制00001010。
ASCII 编码简单高效,但仅支持英文,无法表示汉字、日文、韩文等非英文字符------ 这显然无法满足全球化的需求,于是 Unicode 应运而生。
现代编码:Unicode+UTF-8
Unicode:全球字符的 "唯一编号表"
Unicode(统一码)的核心目标是:给世界上所有语言的字符(汉字、英文、日文、符号等)分配一个唯一的数字编号(码点),彻底解决多语言兼容问题:
编号范围:0-0x10FFFF,可容纳超过 110 万个字符,覆盖全球所有已知文字;
表示格式:U+XXXX(XXXX 为十六进制);
举例:
汉字 "你" → Unicode 码点U+4F60;
汉字 "好" → Unicode 码点U+597D;
字母 "A" → Unicode 码点U+0041(与 ASCII 兼容)。
Unicode 只负责给字符分配唯一编号 ,不规定这个编号如何转换成二进制字节序列------ 这就是 UTF-8 的作用。
UTF-8:Unicode 的 "二进制翻译规则"(最主流)
UTF-8 是目前互联网和操作系统默认的文本编码格式 ,全称 "8 位 Unicode 转换格式",核心特点:变长编码(1-4 个字节)、兼容 ASCII、节省空间。
编码规则(通俗版):系统集成服务
编号≤127(ASCII 字符):U+0000–U+007F,1 个字节,二进制首位为 0(与 ASCII 完全兼容);
128 < 编号≤2047:U+0080–U+07FF,2 个字节,二进制首位为 110、10;
2048 < 编号≤65535:U+0800–U+FFFF,3 个字节,二进制首位为 1110、10、10(第一字节前4位为1110,后续字节前2位为10。汉字常用);
编号 > 65535:U+10000–U+10FFFF4 个字节,二进制首位为 11110、10、10、10。
举例:汉字 "你"(U+4F60,十进制 20320)
编号 20320 在 2048-65535 之间 → 用 3 个字节;
转换为二进制:100111101100000;
按 UTF-8 规则拼接:11100100 10111101 10100000;
最终:汉字 "你" 的 UTF-8 编码为0xE4 0xBD 0xA0(十六进制),对应二进制 3 个字节。
文本编码完整流程(一句话总结)
字符 → Unicode 码点 → UTF-8 编码 → 二进制字节序列 → 存储到硬盘 / 内存 。比如输入 "你好":"你"(U+4F60)→ UTF-8(11100100 10111101 10100000)"好"(U+597D)→ UTF-8(11100101 10110111 10011101)最终存储为6 个字节的二进制数据。
在现代操作系统和互联网中,UTF-8编码通常就扮演了机内码的角色。【在现代计算机体系(尤其是互联网和Windows/Linux/macOS通用环境)中,UTF-8 就是事实上的“机内码”。但在早期的中文Windows系统(如代码页936)中,“机内码”有时特指GBK等双字节编码。】
字形码
计算机中的字符都是以内码的二进制形式表示,我们怎么把数字对应的字符在显示器上显示出来呢?
这就需要依赖字形码,字形码本质上是一个n*n 的像素点阵,通常用 1 表示笔划点,0 表示背景,每一个字符的字形都是预先存放在计算机内,而这样的字形信息库我们称为字库。
比如中文“你”的点阵图,这样一个 16*16 的像素矩阵,需要 16 * 16 / 8 = 32 字节的空间来表示,右边的字模信息称为字形码。不同的字库(如宋体、黑体)对同一个字符的字形编码是不同的。
所以字符编码到显示的字形码,其实又是另一张查找表,也就是字符编码-字形码的映射关系表。
需要注意的是,现代计算机系统中,字形码的存储形式已经从“点阵”进化为了“矢量轮廓数据”。
现代计算机系统中,为了显示平滑、可任意缩放的文字,字库普遍采用矢量字形(如 TrueType、OpenType),而非传统的点阵字模。矢量字形通过数学曲线描述字符轮廓,在显示时动态栅格化,因此比点阵字模更节省存储空间,且缩放不失真。
矢量字形是把文字的形状用数学公式存储,需要显示时再根据尺寸计算出像素,因此无限缩放不失真,是现代操作系统、打印机、网页的默认字体技术。
附录、计算机是如何输入存储输出汉字、图片、音频、视频的 https://blog.csdn.net/cnds123/article/details/142854581
