ASCII 码对照表

ASCII(American Standard Code for Information Interchange)是美国信息交换标准代码,包含 128 个字符(0-127),其中 0-31 和 127 为控制字符,32-126 为可打印字符。

原理解析

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)用 7 个比特表示字符,共 0–127 个码位,是早期计算机字符编码的事实标准。其中 0–31 与 127 是控制字符(如换行 LF、制表 TAB、回车 CR),32–126 是可打印字符(字母、数字、标点)。

由于 7 位只能覆盖英文字符,扩展 ASCII 用第 8 位把范围扩到 128–255,但这一段没有统一标准,Windows-1252、ISO-8859-1 等各 locale 解释不同,跨系统直接传二进制文本常因此出现乱码。

什么时候该查这张表

这张表在你要把「字符 ↔ 码点 ↔ 字节」三者对应起来时有用。排查乱码、验证编码转换、核对协议里的控制字符编号,都要用它。但判断该用哪张表有个前提问题:如果你的目标是「人类可读的文字」,编码方案(UTF-8 / GBK / Shift-JIS)比码点更能决定结果;如果目标是「字节流」,才回到这张 ASCII 表。

不该查的情况:你在处理中文、日文、emoji。这张表覆盖的是 0–127 的 7 位范围,128 以上属于扩展区,各编码解释不同,用 ASCII 表推导非 ASCII 字符的字节一定会错。这类问题应去「字符编码」页确认编码方案,而不是在这里查码点。

判断标准很简单:数字落在 0–127 且你需要知道「这个字节代表什么」时查本表;数字超过 127 时,先确定编码方案,再谈码点。混用这两层是把 UTF-8 的多字节序列当成多个独立字符的最常见来源。

另一个不该查的信号:你只是想判断字符串长度。注意「字符数」「字节数」「码点数」是三个不同的量——ASCII 范围内三者相等,超出后差异极大,emoji 通常一个字符占 2 个码点、4 个 UTF-8 字节。

边界与常见陷阱

  • 控制字符的编号会因方言而异

    0–31 与 127 是控制区,但「哪个编号对应哪个动作」在不同方言里不一致:ASCII 传统把 7 bell、8 backspace、9 tab、10 line feed、13 carriage return,而 Windows 终端把 backspace 做成 8、把换行做成 13+10 两字节序列。跨系统写协议时不能假设「10 就是换行」,要明确对方按哪种约定解释。

  • 「扩展 ASCII」不是标准

    128–255 这段常被称为扩展 ASCII,但它没有统一标准:ISO-8859-1(Latin-1)与 Windows-1252 只在 0x80-0x9F 一段不同,而这个恰好是控制字符与可打印字符的分界,把两者混用会出现「本该不可见的位置显示成图形字符」。这正是很多老系统在意大利语区出现怪字符的原因。

  • 码点不等于字形,同一码点可有多个字符

    Unicode 的基本平面里有大量码点专门用来与现有字符做视觉匹配,其中 494 个「compatibility characters」在正规化时会被等价替换。例如 U+2126 OHM SIGN 规范化为 U+03A9 GREEK CAPITAL OMEGA,U+FB01 的 fi 连字会展开成两个字母。做字符串精确比较、去重或校验时,不做正规化会把视觉相同的字符串判为不同。

  • 十六进制与十进制混用是最常见的转换错误

    码点 0x41 与 65 指的是同一个字符 A。写代码时把本该十六进制的值当十进制(或反之),得到的字符完全无关且不报错——因为值本身在 JS 里是合法数字。核对办法是看字符串长度:ASCII 可打印字符在 0x20-0x7E,若出现超出这个范围的十进制数,就说明有一处混用了。

与相邻内容的分工

要查 GBK / Big5 / Shift-JIS / UTF-8 的字节结构与转换关系,用站内「字符编码」页;本页只覆盖 0–127 的 7 位基础范围。

要查 Emoji 与符号的码点、名称和搜索,用站内「Emoji 速查」页,它按码点而非十进制组织。

要处理 URL 里的百分号编码(如 %20、%E4%B8%AD),那是 UTF-8 字节的十六进制表示,与本页的字符码点不是同一层,用站内「URL 编码」相关工具。

若目的是排查线上乱码,字符编码页的「写出的编码与读出时声称的编码不一致」一节比查码点表更能定位问题。

实战片段

要点:① [...s] 用码点计数而 s.length 用 UTF-16 计数单位,emoji 会被算成 2 —— 限制字符串长度时两者结论完全不同;② TextEncoder 按标准给 UTF-8 字节数,与目标编码无关,若实际是 GBK 则需另算;③ 取码点用 codePointAt 与 String.fromCodePoint 成对使用,不要用 charCodeAt,它在代理对上只返回前半。

// 字符串的三个长度:字符 / 码点 / UTF-8 字节
const s = 'A中🛠'

// ① 码点数(用 [...s] 而非 s.length,emoji 会被算成 2)
const codePoints = [...s].length

// ② UTF-8 字节数(TextEncoder 按标准编码,中文 3 字节、emoji 4 字节)
const bytes = new TextEncoder().encode(s).length

// ③ 各层长度对照 —— ASCII 范围内三者一致,超出后迅速发散
console.log({ charLength: s.length, codePoints, bytes })

// 码点 ↔ 字符:用 codePointAt 而非 charCodeAt(后者取不到代理对的后半)
const back = String.fromCodePoint(0x1f6e0)  // 🛠
const cp = back.codePointAt(0)

/* 典型结果:
  { charLength: 5, codePoints: 3, bytes: 8 }
  charLength 用 UTF-16 计数单位,中文 1、emoji 2,所以是 5;
  码点 3('A'、'中'、'🛠');UTF-8 字节 1+3+4 = 8。
  ⇒ 涉及长度上限(DB 字段、协议头)时必须明确用哪一种口径。 */

实践注解

  • 0x0D 0x0A 与 0x0A 的换行差异会造成「多一个空行」Windows 文本用 CRLF(13,10),Unix 用 LF(10)。把 Windows 文件当 Unix 读取时每行尾会多出 \r,表现为正则 $ 不匹配、比较字符串时不相等。跨平台处理应先统一换行。
  • 控制字符在 JSON/URL 中必须转义0–31 的码位在 JSON 里要写成 \u0000–\u001f,在 URL 里要百分号编码(制表符是 %09)。直接内联会让解析器报错或截断消息,日志采集时尤其常见。
  • DEL(127)不是可打印字符它属于控制字符区,终端里通常不可见,但会占用一个字节。做「可见字符数」统计时若不排除 0–31 与 127,长度会偏大;做输入校验时也应显式拒绝这些码位。

数据来源

  • ANSI X3.4-1986
  • ISO/IEC 646
  • Unicode Standard (C0/C1 controls)

上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。

十进制十六进制字符英文名称中文名称
00x00NULNull空字符
10x01SOHStart of Heading标题开始
20x02STXStart of Text正文开始
30x03ETXEnd of Text正文结束
40x04EOTEnd of Transmission传输结束
50x05ENQEnquiry询问
60x06ACKAcknowledge确认
70x07BELBell响铃
80x08BSBackspace退格
90x09HTHorizontal Tab水平制表
100x0ALFLine Feed换行
110x0BVTVertical Tab垂直制表
120x0CFFForm Feed换页
130x0DCRCarriage Return回车
140x0ESOShift Out移出
150x0FSIShift In移入
160x10DLEData Link Escape数据链路转义
170x11DC1Device Control 1设备控制1
180x12DC2Device Control 2设备控制2
190x13DC3Device Control 3设备控制3
200x14DC4Device Control 4设备控制4
210x15NAKNegative Acknowledge否定确认
220x16SYNSynchronous Idle同步空闲
230x17ETBEnd of Trans. Block传输块结束
240x18CANCancel取消
250x19EMEnd of Medium介质结束
260x1ASUBSubstitute替换
270x1BESCEscape转义
280x1CFSFile Separator文件分隔符
290x1DGSGroup Separator组分隔符
300x1ERSRecord Separator记录分隔符
310x1FUSUnit Separator单元分隔符
320x20SPSpace空格
330x21!Exclamation Mark感叹号
340x22"Quotation Mark双引号
350x23#Number Sign井号
360x24$Dollar Sign美元符号
370x25%Percent Sign百分号
380x26&Ampersand与号
390x27'Apostrophe单引号
400x28(Left Parenthesis左括号
410x29)Right Parenthesis右括号
420x2A*Asterisk星号
430x2B+Plus Sign加号
440x2C,Comma逗号
450x2D-Hyphen连字符
460x2E.Period句点
470x2F/Slash斜杠
480x300Digit Zero数字 0
490x31111
500x32222
510x33333
520x34444
530x35555
540x36666
550x37777
560x38888
570x399Digit Nine数字 9
580x3A:::
590x3B;;;
600x3C<<<
610x3D===
620x3E>>>
630x3F???
640x40@@@
650x41AUppercase A大写 A
660x42BBB
670x43CCC
680x44DDD
690x45EEE
700x46FFF
710x47GGG
720x48HHH
730x49III
740x4AJJJ
750x4BKKK
760x4CLLL
770x4DMMM
780x4ENNN
790x4FOOO
800x50PPP
810x51QQQ
820x52RRR
830x53SSS
840x54TTT
850x55UUU
860x56VVV
870x57WWW
880x58XXX
890x59YYY
900x5AZUppercase Z大写 Z
910x5B[[[
920x5C\\\
930x5D]]]
940x5E^^^
950x5F___
960x60```
970x61aLowercase a小写 a
980x62bbb
990x63ccc
1000x64ddd
1010x65eee
1020x66fff
1030x67ggg
1040x68hhh
1050x69iii
1060x6Ajjj
1070x6Bkkk
1080x6Clll
1090x6Dmmm
1100x6Ennn
1110x6Fooo
1120x70ppp
1130x71qqq
1140x72rrr
1150x73sss
1160x74ttt
1170x75uuu
1180x76vvv
1190x77www
1200x78xxx
1210x79yyy
1220x7AzLowercase z小写 z
1230x7B{{{
1240x7C|||
1250x7D}}}
1260x7E~~~
1270x7FDELDelete删除

常见问题

什么是 ASCII?

ASCII(美国信息交换标准代码)用 7 位二进制表示 128 个字符,包括英文字母、数字、标点与控制字符,是计算机最基础的字符编码。

ASCII 和 Unicode 有什么关系?

ASCII 仅覆盖 128 个字符;Unicode 是其超集,兼容 ASCII 前 128 个码点并扩展到全球文字。UTF-8 是一种 ASCII 兼容的 Unicode 编码。

什么是控制字符?

码点 0-31 与 127 为控制字符(如换行 LF、回车 CR、制表 Tab),不可打印,用于设备控制与文本格式。

为什么常用十六进制表示 ASCII?

十六进制比二进制/十进制更紧凑易读(0x41 = "A"),在调试协议、解析报文时最常用。

怎么查某个字符的 ASCII 码?

在上方对照表中按"字符"列找到目标字符,其左侧"十进制"即为该字符的 ASCII 码,"十六进制"为对应的十六进制值。例如字符 "A" 的十进制 ASCII 码是 65(0x41),空格(SP)是 32(0x20),换行(LF)是 10(0x0A)。