UTF、Unicode 和 ASCII 编码的关系
9月 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 + 下列字母 |
---|---|---|---|---|---|
0 | 00 | NUL | \0 | Null character(空字符) | @ |
1 | 01 | SOH | Start of Header(标题开始) | A | |
2 | 02 | STX | Start of Text(正文开始) | B | |
3 | 03 | ETX | End of Text(正文结束) | C | |
4 | 04 | EOT | End of Transmission(传输结束) | D | |
5 | 05 | ENQ | Enquiry(请求) | E | |
6 | 06 | ACK | Acknowledgment(收到通知/响应) | F | |
7 | 07 | BEL | \a | Bell(响铃) | G |
8 | 08 | BS | \b | Backspace(退格) | H |
9 | 09 | HT | \t | Horizontal Tab(水平制表符) | I |
10 | 0A | LF | \n | Line feed(换行键) | J |
11 | 0B | VT | \v | Vertical Tab(垂直制表符) | K |
12 | 0C | FF | \f | Form feed(换页键) | L |
13 | 0D | CR | \r | Carriage return(回车键) | M |
14 | 0E | SO | Shift Out(不用切换) | N | |
15 | 0F | SI | Shift In(启用切换) | O | |
16 | 10 | DLE | Data Link Escape(数据链路转义) | P | |
17 | 11 | DC1 | Device Control 1(设备控制1) /XON(Transmit On) | Q | |
18 | 12 | DC2 | Device Control 2(设备控制2) | R | |
19 | 13 | DC3 | Device Control 3(设备控制3) /XOFF(Transmit Off) | S | |
20 | 14 | DC4 | Device Control 4(设备控制4) | T | |
21 | 15 | NAK | Negative Acknowledgement(拒绝接收/无响应) | U | |
22 | 16 | SYN | Synchronous Idle(同步空闲) | V | |
23 | 17 | ETB | End of Trans the Block(传输块结束) | W | |
24 | 18 | CAN | Cancel(取消) | X | |
25 | 19 | EM | End of Medium(已到介质末端/介质存储已满) | Y | |
26 | 1A | SUB | Substitute(替补/替换) | Z | |
27 | 1B | ESC | \e | Escape(溢出/逃离/取消) | [ |
28 | 1C | FS | File Separator(文件分割符) | \ | |
29 | 1D | GS | Group Separator(分组符) | ] | |
30 | 1E | RS | Record Separator(记录分隔符) | ^ | |
31 | 1F | US | Unit Separator(单元分隔符) | _ | |
127 | 7F | DEL | Delete(删除) | ? |
控制字符:表示某一控制功能的字符。 ↩︎