跳到主要内容

ASCII 码表完全指南:0-127 控制字符与十进制十六进制对照

从 0 到 127 看懂 ASCII 表:控制字符与可打印字符怎么分,十进制十六进制二进制怎么换算,A 等于 65、a 等于 97、数字 0 从 48 起,这些字符码在编程里到底干什么用。

发布于 作者 李雷
#ASCII #字符编码 #控制字符 #进制转换 #编程基础

ASCII 码表完全指南:0-127 控制字符与十进制十六进制对照

写代码越久,越会发现自己经常回头查同一张表。一段十六进制 dump、一个跨平台换行符的 bug、一个正则字符类里要写的字节,绕来绕去都落到 ASCII 这 128 个码位上。这篇把这张表讲清楚:它怎么排,控制字符和可打印字符的分界在哪,常用字符码该记哪几个,以及它们在实际编程里怎么用。

ASCII 是什么,为什么只有 128 个

ASCII 全称 American Standard Code for Information Interchange,1963 年由美国标准协会发布,用 7 个二进制位给字符编号,所以总共 2 的 7 次方等于 128 个码位,编号从 0 到 127,一个都不多。这就是为什么标准 ASCII 永远停在 127:第 8 位在原始标准里要么留作校验,要么干脆不用。今天说的 "扩展 ASCII"(128 到 255)其实没有唯一标准,Latin-1、Windows-1252、代码页 437 各说各话,这点后面会提。

我自己第一次真正理解这张表,是在调一个串口设备时被逼出来的。当时屏幕上只有一串裸字节,没有任何字符显示,只能对着码表一个个翻,翻着翻着结构就刻进脑子里了。

控制字符(0-31)和 DEL(127)

0 到 31 这 32 个码位加上末尾的 127,合起来 33 个,都是控制字符。它们不显示成字形,而是发指令。其中一批今天仍然天天在跑:

  • LF(10,\n)换行,Unix 和 macOS 用它单独表示换行。
  • CR(13,\r)回车,光标回到行首。
  • TAB(9)缩进。
  • ESC(27)是每一段终端颜色和光标移动序列的开头。
  • NUL(0)是 C 字符串的结束符。
  • BEL(7)今天仍能让终端响铃。

剩下那批传输控制码(SOH、STX、ETX、ACK、NAK 等)主要活在串口协议和老旧工业设备里。顺带解开一个常见疑惑:Ctrl+C 对应的是 ETX(3),Ctrl+S 会冻住终端是因为它发的是 XOFF。要把任意码位的二进制位拆开看,可以用 /zh/t/text-to-binary/ 把字符直接转成八位二进制对照。

可打印字符(32-126)与几个该背的码值

32 到 126 是能看见的字符,从空格开始,到波浪号 ~ 结束。这一段有几个码值值得记死:

  • 空格是 32。
  • 数字 0 是 48,所以 '0''9' 是 48 到 57,把字符减去 48 就得到它代表的数字。
  • 大写 A 是 65,十六进制写作 0x41
  • 小写 a 是 97。

这里有个很优雅的细节:A(65)和 a(97)正好差 32,而 32 是 2 的 5 次方,也就是第 6 位。所以大小写转换在底层就是翻转那一位,这也是为什么很多老代码用 c ^ 0x20 来切换大小写。把这条记住,面试里被问 "'A' 的 ASCII 码是多少" 就再也不会卡壳。

十进制 / 十六进制 / 二进制怎么对照

同一个字符可以用多种进制写。还是拿大写 A 举例,它在四种常见进制里分别是:十进制 65,十六进制 0x41,八进制 0o101,二进制 01000001。在代码里互转也很直接:

  • JavaScript:"A".charCodeAt(0) 得到 65,String.fromCharCode(65) 得到 "A",(65).toString(16) 得到 "41"
  • Python:ord("A") 得到 65,chr(65) 得到 "A"

把十进制、十六、八、二进制并排放着看,进制转换会从死记硬背变成直觉。需要在任意进制之间换算更大的数时,可以配合 /zh/t/base-converter/ 一起用。

这张表在编程里到底解决什么问题

说几个我反复遇到的真实场景。其一,读 xxd 的十六进制 dump:看到 0x48 0x49 0x0A,逐个对照就是 HILF,三十秒手解出 "HI\n",顺便确认设备用的是裸 LF 而不是 CR+LF。其二,排查换行符 bug:Linux CI 报 bad interpreter: /bin/bash^M,查一下 CR 是 13、是那个肉眼可见的 ^M,用 dos2unix 去掉就好。其三,写分词器或 CSV 解析器时要对具体字节较真,分隔符到底是 TAB(9)还是 US(31),查清码值再丢进 charCodeAt 或正则字符类,心里就有底。

这 128 个码位是几乎所有现代文本编码的地基,UTF-8 的前 128 个码位就和 ASCII 完全一致。把这张表彻底吃透,后面遇到的多数 "乱码" 和 "换行符" 问题都会变成显而易见的小事。完整可搜索的码表在 /zh/t/ascii-table-reference/,输入 65、0x41 或字符本身都能跳到对应行,点任意值即可复制。


Made by Toolora · Updated 2026-06-13