Skip to content

ASCII 码表与在线转换器

完整 ASCII 码表:128 个字符的十进制、十六进制、八进制、二进制对照,支持字符转 ASCII 码、ASCII 码转字符双向转换。控制字符附各语言转义写法与终端 ^M 记法,并说明你会在哪儿真的遇到它。浏览器本地运行,不上传。

无追踪 浏览器中运行 免费

全部在你的浏览器里运行——输入不会被上传、记录或存储。

文本与 ASCII 码双向转换

完整 ASCII 码表(0–127)

128 / 128
十进制 十六进制 八进制 二进制 字符 名称 转义 Caret HTML 在哪儿会遇到
0 00 000 00000000 NUL Null \0 ^@ � C 语言的字符串终止符;find -print0 与 xargs -0 用它分隔文件名;grep 一见它就报「Binary file matches」。
1 01 001 00000001 SOH Start of Heading ^A  FIX 金融协议拿它当字段分隔符,所以 FIX 报文看起来是挤成一行的键值对。
2 02 002 00000010 STX Start of Text ^B  串口、POS 机、条码枪协议的帧头;tmux 的默认前缀键 Ctrl+B。
3 03 003 00000011 ETX End of Text ^C  按 Ctrl+C 发出的就是这个字节;tty 行规程把它翻译成 SIGINT,程序本身收不到它。
4 04 004 00000100 EOT End of Transmission ^D  Ctrl+D 提交当前输入行;当行为空时 read 返回 0 字节,那才是 EOF。
5 05 005 00000101 ENQ Enquiry ^E  老式链路握手;部分终端收到它会回送一串标识。
6 06 006 00000110 ACK Acknowledge ^F  与 ENQ、NAK 配对的老式链路层应答;现在只在工业串口设备上还能见到。
7 07 007 00000111 BEL Bell \a ^G  printf '\a' 会响铃;更常见的现代用途是当 OSC 序列的终止符,比如设置窗口标题。
8 08 010 00001000 BS Backspace \b ^H  进度条回退擦除。注意大多数终端的 Backspace 键发的是 0x7F,不是这个字节。
9 09 011 00001001 HT Character Tabulation \t ^I 	 Makefile 的 recipe 行必须以真 TAB 开头;gofmt 用 TAB 缩进;Tab 键和 Ctrl+I 是同一个字节。
10 0A 012 00001010 LF Line Feed \n ^J 
 Unix 和 macOS 的换行;git 的 core.autocrlf 就在它和 CRLF 之间转换。
11 0B 013 00001011 VT Line Tabulation \v ^K  几乎绝迹了,但仍算换行符:splitlines() 会在它这里断行,而 split("\n") 不会。
12 0C 014 00001100 FF Form Feed \f ^L  打印机换页;Ctrl+L 清屏;Emacs 拿它当源码里的分节符。
13 0D 015 00001101 CR Carriage Return \r ^M 
 Windows CRLF 的前半;在 git diff 里显示为 ^M;造成「bad interpreter: /bin/bash^M」。
14 0E 016 00001110 SO Shift Out ^N  ISO 2022 里切到 G1 备用字符集;在 EBCDIC 主机上成对包裹双字节汉字区。
15 0F 017 00001111 SI Shift In ^O  切回 G0 默认字符集,与 SO 配对。
16 10 020 00010000 DLE Data Link Escape ^P  老式二进制协议里做字节填充的转义前缀。
17 11 021 00010001 DC1 Device Control One ^Q  XON——软件流控恢复;Ctrl+Q 解冻终端输出。
18 12 022 00010010 DC2 Device Control Two ^R  现代没有固定语义。shell 里的 Ctrl+R 是 readline 的按键绑定,与这个码无关。
19 13 023 00010011 DC3 Device Control Three ^S  XOFF——软件流控暂停。误按 Ctrl+S 是终端「假死」最常见的原因。
20 14 024 00010100 DC4 Device Control Four ^T  现代没有固定语义;BSD 和 macOS 上 Ctrl+T 是 tty 的状态键。
21 15 025 00010101 NAK Negative Acknowledge ^U  Ctrl+U 删除整行——那是 tty 的 kill 设置,与这个码的原义无关。
22 16 026 00010110 SYN Synchronous Idle ^V  Ctrl+V 是 lnext:先按它再按 Tab,才能在 bash 里输入一个真正的 TAB 而不触发补全。
23 17 027 00010111 ETB End of Transmission Block ^W  Ctrl+W 删除前一个词——tty 的 werase 设置。
24 18 030 00011000 CAN Cancel ^X  ECMA-48 用它中止一个没写完的控制序列;终端会丢弃正在解析的那一段。
25 19 031 00011001 EM End of Medium ^Y  今天几乎不用;BSD 和 macOS 上 Ctrl+Y 是延迟挂起。
26 1A 032 00011010 SUB Substitute ^Z  CP/M 与 DOS 文本文件的结束标记,所以 Windows 控制台用 Ctrl+Z 结束输入。
27 1B 033 00011011 ESC Escape ^[  所有 ANSI 转义序列的起点:\033[0m 重置颜色,\033[2J 清屏。Ctrl+[ 发的也是它。
28 1C 034 00011100 FS File Separator ^\  HL7 v2 的 MLLP 封装拿它当块结束符;Ctrl+\ 发 SIGQUIT。
29 1D 035 00011101 GS Group Separator ^]  GS1 条码里的 FNC1 分隔符就是这个字节——扫码枪吐出来的那个看不见的分隔符。
30 1E 036 00011110 RS Record Separator ^^  RFC 7464 的 JSON 文本序列用它给每条记录开头。少数几个还活着的现代用途之一。
31 1F 037 00011111 US Unit Separator ^_  结构化文本里的字段分隔,比逗号安全,因为正文里几乎不会出现它。
32 20 040 00100000 Space  
33 21 041 00100001 Exclamation Mark !
34 22 042 00100010 Quotation Mark "
35 23 043 00100011 Number Sign #
36 24 044 00100100 Dollar Sign $
37 25 045 00100101 Percent Sign %
38 26 046 00100110 Ampersand &
39 27 047 00100111 Apostrophe '
40 28 050 00101000 Left Parenthesis (
41 29 051 00101001 Right Parenthesis )
42 2A 052 00101010 Asterisk *
43 2B 053 00101011 Plus Sign +
44 2C 054 00101100 Comma ,
45 2D 055 00101101 Hyphen-Minus -
46 2E 056 00101110 Full Stop .
47 2F 057 00101111 Solidus /
48 30 060 00110000 Digit Zero 0
49 31 061 00110001 Digit One 1
50 32 062 00110010 Digit Two 2
51 33 063 00110011 Digit Three 3
52 34 064 00110100 Digit Four 4
53 35 065 00110101 Digit Five 5
54 36 066 00110110 Digit Six 6
55 37 067 00110111 Digit Seven 7
56 38 070 00111000 Digit Eight 8
57 39 071 00111001 Digit Nine 9
58 3A 072 00111010 Colon :
59 3B 073 00111011 Semicolon &#59;
60 3C 074 00111100 Less-Than Sign <
61 3D 075 00111101 Equals Sign =
62 3E 076 00111110 Greater-Than Sign >
63 3F 077 00111111 Question Mark ?
64 40 100 01000000 Commercial At @
65 41 101 01000001 Latin Capital Letter A A
66 42 102 01000010 Latin Capital Letter B B
67 43 103 01000011 Latin Capital Letter C C
68 44 104 01000100 Latin Capital Letter D D
69 45 105 01000101 Latin Capital Letter E E
70 46 106 01000110 Latin Capital Letter F F
71 47 107 01000111 Latin Capital Letter G G
72 48 110 01001000 Latin Capital Letter H H
73 49 111 01001001 Latin Capital Letter I I
74 4A 112 01001010 Latin Capital Letter J J
75 4B 113 01001011 Latin Capital Letter K K
76 4C 114 01001100 Latin Capital Letter L L
77 4D 115 01001101 Latin Capital Letter M M
78 4E 116 01001110 Latin Capital Letter N N
79 4F 117 01001111 Latin Capital Letter O O
80 50 120 01010000 Latin Capital Letter P P
81 51 121 01010001 Latin Capital Letter Q Q
82 52 122 01010010 Latin Capital Letter R R
83 53 123 01010011 Latin Capital Letter S S
84 54 124 01010100 Latin Capital Letter T T
85 55 125 01010101 Latin Capital Letter U U
86 56 126 01010110 Latin Capital Letter V V
87 57 127 01010111 Latin Capital Letter W W
88 58 130 01011000 Latin Capital Letter X X
89 59 131 01011001 Latin Capital Letter Y Y
90 5A 132 01011010 Latin Capital Letter Z Z
91 5B 133 01011011 Left Square Bracket [
92 5C 134 01011100 Reverse Solidus \
93 5D 135 01011101 Right Square Bracket ]
94 5E 136 01011110 Circumflex Accent ^
95 5F 137 01011111 Low Line _
96 60 140 01100000 Grave Accent `
97 61 141 01100001 Latin Small Letter A a
98 62 142 01100010 Latin Small Letter B b
99 63 143 01100011 Latin Small Letter C c
100 64 144 01100100 Latin Small Letter D d
101 65 145 01100101 Latin Small Letter E e
102 66 146 01100110 Latin Small Letter F f
103 67 147 01100111 Latin Small Letter G g
104 68 150 01101000 Latin Small Letter H h
105 69 151 01101001 Latin Small Letter I i
106 6A 152 01101010 Latin Small Letter J j
107 6B 153 01101011 Latin Small Letter K k
108 6C 154 01101100 Latin Small Letter L l
109 6D 155 01101101 Latin Small Letter M m
110 6E 156 01101110 Latin Small Letter N n
111 6F 157 01101111 Latin Small Letter O o
112 70 160 01110000 Latin Small Letter P p
113 71 161 01110001 Latin Small Letter Q q
114 72 162 01110010 Latin Small Letter R r
115 73 163 01110011 Latin Small Letter S s
116 74 164 01110100 Latin Small Letter T t
117 75 165 01110101 Latin Small Letter U u
118 76 166 01110110 Latin Small Letter V v
119 77 167 01110111 Latin Small Letter W w
120 78 170 01111000 Latin Small Letter X x
121 79 171 01111001 Latin Small Letter Y y
122 7A 172 01111010 Latin Small Letter Z z
123 7B 173 01111011 Left Curly Bracket {
124 7C 174 01111100 Vertical Line |
125 7D 175 01111101 Right Curly Bracket }
126 7E 176 01111110 Tilde ~
127 7F 177 01111111 DEL Delete ^?  大多数终端上 Backspace 键实际发送的就是它。名字来自纸带:七个孔全打穿。

二进制列补足到 8 位是为了好读。ASCII 本身是 7 位编码,最高位恒为 0——正是这一点让 UTF-8 得以向后兼容它。

那 128–255 呢?

ASCII 根本不定义 128–255。「扩展 ASCII」不是任何标准的名字,它只是一类 8 位编码的口语统称。同一个字节在每一个里都是不同的字符:

字节 ISO-8859-1 Windows-1252 CP437 CP866
0x80 U+0080 C1 控制字符(不可见) Ç А
0x93 U+0093 C1 控制字符(不可见) ô У
0xB0 ° °
0xE9 é é Θ щ
0xFF ÿ ÿ U+00A0 U+00A0
字符分类在测试时与 Unicode 自己的类别交叉校验,Windows-1252 映射逐字节与平台解码器比对。 — Go-Tools 工程团队 · 2026年9月2日

表里每一个值都由同一个引擎生成,服务端和浏览器跑的是同一份代码,所以爬虫读到的内容和你交互得到的结果不可能漂移。各语言转义写法的差异是逐个编译运行验证出来的,不是凭印象写的。

速查

字母 A 的 ASCII 码是多少?

A = 65 大写 `A` 是十进制 65、十六进制 `0x41`、八进制 `101`、二进制 `01000001`。小写 `a` 是 97——正好多 32,也就是一个二进制位。

ASCII 一共多少个字符?

128 128 个,编号 0 到 127。其中 32 个控制字符、95 个图形字符(含空格)、以及 DEL。

ASCII 0 是什么?

0 = NUL NUL,空字符。它在 C 里终止字符串,在 `find -print0` 里分隔文件名,也会让 `grep` 把文件当成二进制。

换行符是哪个字节?

LF = 10,CR = 13 换行 LF 是 10(`0x0A`、`\n`),回车 CR 是 13(`0x0D`、`\r`)。Windows 的换行是两个都有,CR 在前。

什么是 ASCII?

ASCII 是一种 7 位字符编码——128 个码位,编号 0 到 127,再没有更多。它最初以 ASA X3.4-1963 发布,现行版本是 ANSI X3.4-1986;RFC 20 描述了它在互联网上的用法,并于 2015 年被提升为互联网标准 STD 80。最初的版本连小写字母都没有,小写是 1967 年修订版才加进去的。127 以上的一切都属于别的编码,不属于 ASCII。

0x00-0x1F   32 C0 control characters
0x20         1 space (a graphic character, not a control)
0x21-0x7E   94 printable graphic characters
0x7F         1 DEL (a control character, but not part of C0)
            ---
            128 total

这张表能给你什么

四种进制并排对照

128 个码位每一个都给出十进制、十六进制、八进制和 8 位二进制,那个前导 0 时刻提醒你 ASCII 其实是 7 位的。

分语言的转义写法

\0 \a \b \t \n \v \f \r 这一列,外加那些真的会让构建挂掉的差异——JavaScript 没有 \a,Java 既没有 \a 也没有 \v,而 \e 是 GNU 扩展不是 ISO C。

caret 记法

^@^? 这一列,以及对全部 33 个控制字符都成立的那一条规则:字节值与 0x40异或。不是加,不是减,是异或。

每个控制字符你会在哪儿真的遇到它

不只是「SOH——标题开始」,而是 FIX 金融协议拿它当字段分隔符、0x1D 是扫码枪吐出来的那个看不见的分隔符、误按 Ctrl+S 让终端假死其实是 XOFF。

一个拒绝猜测的转换器

进制由你选。超过 127 的字节会被拒绝,并附上它在 Windows-1252 和 ISO-8859-1 下分别读作什么——而不是把它冒充成 ASCII。

控制字符不会消失

NUL、TAB、CR 没有字形,所以预览区用 Unicode 控制图形字符把它们显形。复制按钮给你的仍然是真正的字节。

相关编码

ISO/IEC 8859-1(Latin-1)

8 位单字节

0–127 与 ASCII 完全相同,0xA00xFF 定义了 96 个图形字符。0x800x9F 那一段留给了不可见的 C1 控制字符。

Windows-1252

8 位单字节

ISO-8859-1 的超集,唯一差别在 0x800x9F:那里它放了 27 个可打印字符,另有 5 个未定义。网页只要声明 ISO-8859-1,浏览器实际用的就是它。

CP437

8 位单字节

IBM PC 的原始代码页。高半区是重音字母、希腊字母和制表符——那些承诺「256 个 ASCII 字符」的文章配的图,多半就是它。

UTF-8

变长,1–4 字节

能编码全部 Unicode,同时每个 ASCII 字节逐字节保持不变。它向后兼容的是 US-ASCII,不兼容上面任何一个 8 位代码页。

示例

文本转十进制码

Hello
72 101 108 108 111

每个字符变成它的十进制码位。大写字母是 65–90,小写是 97–122,正好差 32 —— 也就是一个二进制位,所以 c | 0x20 能转小写。

同一串码,两种进制两种结果

41 42 43
十六进制 -> ABC     十进制 -> )*+

这就是本工具绝不替你猜进制的原因。两种读法都合法,只有你知道自己指的是哪一种。

控制字符能完整往返

9 10 13 0
TAB、LF、CR、NUL

它们在输出框里是看不见的,所以预览行用 Unicode 控制图形字符把它们显形。复制按钮复制的仍然是真正的字节,不是这些替身。

超过 127 的字节会被拒绝,并告诉你原因

233
超出 ASCII 范围(0–127)

233 不是 ASCII 码。工具会告诉你它在 Windows-1252 和 ISO-8859-1 里都读作 é,但不会假装那是 ASCII。

使用方法

  1. 1

    先选进制

    十进制、十六进制、八进制或二进制。这一步要先做——同一串数字在不同进制下解码结果不同,本工具刻意不替你猜。

  2. 2

    任意一边输入

    左边是文本,右边是码。在哪边输入,另一边就跟着更新。

  3. 3

    看提示

    超出 0–127 的字符会连同码点和 UTF-8 字节一起列出来,而不是被悄悄丢掉或换成问号。

  4. 4

    把表当速查手册

    可以只筛控制字符,可以按码值或名称搜索,点任意字符即可复制。

值得知道的几个坑

说 ASCII 有 256 个字符

ASCII 到 127 为止。再往上属于某个必须点名的 8 位代码页。你让 Python 把一个带重音的字符编码成 ASCII,它会直接把这句话说出来。

✗ 错误
'cafe\u00e9'.encode('ascii')  # UnicodeEncodeError: ordinal not in range(128)
✓ 正确
'cafe\u00e9'.encode('utf-8')   # b'cafe\xc3\xa9'

以为各语言的转义都一样

JavaScript 没有 \a 这个转义。它不会报错,而是把反斜杠丢掉留下那个字母,严格模式也救不了你。

✗ 错误
"\a".charCodeAt(0)   // 97 - that is the letter 'a', not BEL
✓ 正确
"\x07".charCodeAt(0) // 7 - BEL

把 caret 记法讲成加法

0x40 对 C0 区成立,到了 DEL 就断了——那里你得改成减。异或是唯一一条覆盖全部 33 个的规则。

✗ 错误
caret = chr(code + 0x40)   # 0x7F + 0x40 overflows past the table
✓ 正确
caret = chr(code ^ 0x40)   # 0x00 -> @, 0x1B -> [, 0x7F -> ?

什么时候用得上

读十六进制 dump 或协议报文
手上是一堆字节,需要分清哪些可打印、哪些是分隔符、哪些是终端正在悄悄执行的控制码。
排查行为诡异的文件
每行末尾多出来的 CR、让 grep 判定成二进制文件的 NUL、或者 Makefile 里必须是真 TAB 的那个位置。
写解析器或校验逻辑
决定接受哪些字节区间,并且把边界定对——图形字符是 0x210x7E,空格是 0x20,DEL 是 0x7F
解释一个编码 bug
向同事说明为什么同一个字节,在不同人假设的代码页下会显示成三个不同的字符。

技术细节

ASCII、Unicode 与 UTF-8
Unicode 的前 128 个码位 U+0000 到 U+007F 与 ASCII 一一对应。UTF-8 把它们编码为单个字节 0x000x7F,最高位为 0。真正载重的是第三条:多字节 UTF-8 序列的每一个字节最高位都是 1,所以 0–127 范围内的字节永远不会是某个非 ASCII 字符的一部分。这才是「可以逐字节在 UTF-8 里找 /\0\n」的根据。
第 8 位
ASCII 定义的是 7 位码;一个字符占一个 8 位字节是存储惯例,而历史上那个空出来的位常常被拿去做奇偶校验位。只保证 7 位透明的邮件链路,正是 Base64 和 quoted-printable 存在的理由。
字母表为什么是这个排法
数字 09 落在 0x300x39,所以低 4 位就是数值本身。A0x41a0x61——只差一个位,所以 c | 0x20 转小写、c & 0xDF 转大写。但这只对字母成立'_' | 0x20 得到的是 0x7F,也就是 DEL;'[' | 0x20 得到的是 {
国家变体与 0x5C 问题
ISO/IEC 646 允许 12 个码位按国家替换。日本的 JIS X 0201 把 0x5C 定为日元号,韩国的 KS X 1003 定为韩元号——所以日文 Windows 上路径显示成带日元号的样子,而字节仍然是 0x5C。Shift_JIS 里更糟:双字节字符的第二个字节本身可能就是 0x5C,「表」「ソ」「十」「能」「構」「暴」这些字都是,把它当反斜杠处理的代码会把汉字劈成两半。

怎样才算写对

永远点名是哪个代码页
说「扩展 ASCII」等于什么都没说。要说 Windows-1252、ISO-8859-1,或者 CP437——同一个字节在每一个里都是不同的字符。
要写 US-ASCII 就写 US-ASCII
那是 IANA 的注册名。charset=ascii 不是;而在浏览器里写 charset=ISO-8859-1,你实际拿到的是 Windows-1252——WHATWG 编码标准就是这么规定这个标签的。
绝不替用户猜进制
如果你的工具或解析器悄悄认定 41 是十六进制,它大约有一半的时候是错的,而且失败是静默的。
按码点迭代,不要按 UTF-16 单元
"A" 加上一个高音谱号再加一个汉字,.length 是 4 但实际只有 3 个字符。用 [...str]codePointAt,否则你的「不支持的字符」提示会把一个 emoji 报成两个残缺的半边。

常见问题

ASCII 一共有多少个字符?
128 个。ASCII 是 7 位编码,只定义 0 到 127 这些码位:32 个 C0 控制字符、95 个图形字符(含空格)、以及 DEL。标题写着「ASCII 完整码表(256 个)」的文章,展示的其实是某个具体的 8 位代码页——多半是 CP437 或 Windows-1252——不是 ASCII。
什么是扩展 ASCII?
严格说来,没有这个东西。「扩展 ASCII」不是任何标准的名字,它只是一类 8 位编码的口语统称:它们的 0–127 与 ASCII 相同,128–255 各定各的。字节 0xE9 在 ISO-8859-1 里是 é,在 CP437 里是希腊字母 Θ,在 CP866 里是西里尔字母 щ。不说清是哪个代码页,这个问题就没有答案。
Windows-1252 就是 ISO-8859-1 吗?
两者在 0xA00xFF 完全相同,在 0x800x9F 完全不同。ISO-8859-1 把这一段留给不可见的 C1 控制字符;Windows-1252 在这里放了 27 个可打印字符——欧元号、弯引号、短破折号和长破折号——另有 5 个位置未定义。所以从 Word 里复制出来的弯引号,一旦经过真正的 ISO-8859-1,就会变成不可见的控制字符。
DEL 是控制字符吗?
是。Unicode 把 U+007F 归为 Cc,C 标准库的 iscntrl(127) 也为真。它只是不属于 C0 集合——C0 严格是 0x000x1F。它排在表尾是因为纸带:0x7F 是七个孔全打穿,而孔一旦打了就填不回去,所以「全部打穿」是唯一能表示「这个字符作废」的办法。
空格算控制字符吗?
不算,而且很多中文码表在这里是错的。Unicode 把空格(0x20)归为 Zs(空格分隔符),属于图形字符。控制字符只有 0x000x1F0x7F
ASCII 是 7 位的,为什么二进制列显示 8 位?
因为字节才是实际存储的单位,最高位恒为 0。这个补零不是为了好看:正因为 ASCII 从不使用第 8 位,UTF-8 才能把最高位拿来当「这是多字节序列的一部分」的标志,也正是这一点让 UTF-8 向后兼容 ASCII。
各语言写控制字符的转义都一样吗?
不一样,而且差异会咬人。\a(响铃)在 C 和 Python 里是标准的,但 JavaScript 根本没有这个转义——'\a' 会静默变成字母 a,连严格模式都不报错。Java 既不认 \a 也不认 \v。Go 不接受 \0,因为它的八进制转义必须恰好三位,要写 \000。而表示 ESC 的 \e 是 GNU 扩展,不是 ISO C 标准。
git diff 或 vim 里的 ^M 是什么?
是回车符,字节 13。caret 记法把控制字符的值与 0x40异或:CR(0x0D)变成 ^M,ESC(0x1B)变成 ^[。每行末尾都是 ^M 说明文件是 Windows 的 CRLF 换行;看到 bad interpreter: /bin/bash^M 说明脚本带上了它。