UTF、Unicode 和 ASCII 编码的关系

UTF、Unicode 和 ASCII 编码的关系

Sep 20, 2019
系统设计

说 UTF 需要先说 Unicode,而说 Unicode 需要先说 ASCII,这三者正好是历史的发展一步步进化而来的,是计算机领域为了解决全世界各种文字之间的编码统一问题而给出的通用解决方案。

ASCII 码表 #

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,是美国在 60 年代制定的一套英文字符和二进制编码的对应关系1

ASCII 码一共规定了128个字符的编码,包含控制字符和可显示字符。其中 ASCII 控制字符2的编号范围是 0-31 和 127(0x00-0x1F和0x7F),共33个字符。可显示字符编号范围是 32-126(0x20-0x7E),共95个字符。

到此,英语世界用 128 个符号编码就够了,包括写代码,但是用来表示其他语言,128个符号是不够的。

Unicode #

Unicode,官方中文名称为统一码,是计算机科学领域的业界标准。它整理、编码了世界上大部分的文字系统,使得电脑可以用更为简单的方式来呈现和处理文字3

Unicode 只是一个符号集,它只规定了符号对应的二进制值,并没有规定计算机世界如何表示,即这个二进制编码如何存储和传输。

UTF-8 #

如何在计算机里实现 Unicode 字符集,是 UTF-8 等编码技术实现的,类似的还有 UTF-16、UTF-32、GBK。

UTF-8 的实现细节感兴趣可以参考下面两篇博客:

\r\n\r\n 三者区别 #

Windows 系统里面,每行结尾是“<回车><换行>”,即 \r\n(CR + LF);

Unix 系统里,每行结尾只有“<换行>”,即 \n(LF);

Mac 系统里,每行结尾是“<回车>”, 即 \r(CR);

回车和换行不是一个概念,在打印的时候,回车表示从当前行的行尾转到当前行的行首;换行表示从当前转到下一行(如果是单独的换行,不一定转到下一行的行首)

不同系统所定义的换行格式不同,导致的直接后果是,Unix/Mac 系统下的文件在 Windows 里打开的话,所有文字会变成一行;而 Windows 里的文件在 Unix/Linux 下打开的话,在每行的结尾会多车一个 ^M 字符。

ASCII 控制字符参考(共 33 个) #

十进制十六进制控制字符转义字符说明Ctrl + 下列字母
000NUL\0Null character(空字符)@
101SOHStart of Header(标题开始)A
202STXStart of Text(正文开始)B
303ETXEnd of Text(正文结束)C
404EOTEnd of Transmission(传输结束)D
505ENQEnquiry(请求)E
606ACKAcknowledgment(收到通知/响应)F
707BEL\aBell(响铃)G
808BS\bBackspace(退格)H
909HT\tHorizontal Tab(水平制表符)I
100ALF\nLine feed(换行键)J
110BVT\vVertical Tab(垂直制表符)K
120CFF\fForm feed(换页键)L
130DCR\rCarriage return(回车键)M
140ESOShift Out(不用切换)N
150FSIShift In(启用切换)O
1610DLEData Link Escape(数据链路转义)P
1711DC1Device Control 1(设备控制1) /XON(Transmit On)Q
1812DC2Device Control 2(设备控制2)R
1913DC3Device Control 3(设备控制3) /XOFF(Transmit Off)S
2014DC4Device Control 4(设备控制4)T
2115NAKNegative Acknowledgement(拒绝接收/无响应)U
2216SYNSynchronous Idle(同步空闲)V
2317ETBEnd of Trans the Block(传输块结束)W
2418CANCancel(取消)X
2519EMEnd of Medium(已到介质末端/介质存储已满)Y
261ASUBSubstitute(替补/替换)Z
271BESC\eEscape(溢出/逃离/取消)[
281CFSFile Separator(文件分割符)\
291DGSGroup Separator(分组符)]
301ERSRecord Separator(记录分隔符)^
311FUSUnit Separator(单元分隔符)_
1277FDELDelete(删除)?

  1. https://zh.wikipedia.org/wiki/ASCII ↩︎

  2. 控制字符:表示某一控制功能的字符。 ↩︎

  3. https://zh.wikipedia.org/wiki/Unicode ↩︎

本文共 1544 字,上次修改于 Apr 21, 2022,以 CC 署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可。