ASCII(アスキー)は、128 個の文字に 0〜127 の番号を割り当てた文字コードです。内訳は制御文字 33 個(0〜31 と 127)と、表示できる文字 95 個(32〜126、空白を含む)で、どの番号も 7 ビットに収まります。この記事の 2 つの表で、全 128 文字を 10 進数・16 進数・8 進数・2 進数(7 桁)で確認できます。

表の値はほかのサイトから書き写したものではなく、一次資料から生成しています。制御文字の略号と名称は、USAS X3.4-1968 を収録した RFC 20(1969 年)の凡例に従い、表示できる文字の名前は Unicode Character Database 18.0 の正式名です。Unicode の最初の 128 個(U+0000〜U+007F)は ASCII と同じ文字なので、表の番号はそのまま Unicode のコードポイントでもあります。

ASCIIコード表(表示できる文字 32〜126)

32〜126 は、英語配列のキーボードで入力できる文字です。32 が空白、48〜57 が数字、65〜90 が英大文字、97〜122 が英小文字で、残りが記号です。日本語入力の全角英数字(A、1 など)はこの表に含まれません。理由は後の節で説明します。

10進16進8進2進文字Unicode 名
32200400100000(空白)SPACE
33210410100001!EXCLAMATION MARK
34220420100010"QUOTATION MARK
35230430100011#NUMBER SIGN
36240440100100$DOLLAR SIGN
37250450100101%PERCENT SIGN
38260460100110&AMPERSAND
39270470100111'APOSTROPHE
40280500101000(LEFT PARENTHESIS
41290510101001)RIGHT PARENTHESIS
422A0520101010*ASTERISK
432B0530101011+PLUS SIGN
442C0540101100,COMMA
452D0550101101-HYPHEN-MINUS
462E0560101110.FULL STOP
472F0570101111/SOLIDUS
483006001100000DIGIT ZERO
493106101100011DIGIT ONE
503206201100102DIGIT TWO
513306301100113DIGIT THREE
523406401101004DIGIT FOUR
533506501101015DIGIT FIVE
543606601101106DIGIT SIX
553706701101117DIGIT SEVEN
563807001110008DIGIT EIGHT
573907101110019DIGIT NINE
583A0720111010:COLON
593B0730111011;SEMICOLON
603C0740111100<LESS-THAN SIGN
613D0750111101=EQUALS SIGN
623E0760111110>GREATER-THAN SIGN
633F0770111111?QUESTION MARK
64401001000000@COMMERCIAL AT
65411011000001ALATIN CAPITAL LETTER A
66421021000010BLATIN CAPITAL LETTER B
67431031000011CLATIN CAPITAL LETTER C
68441041000100DLATIN CAPITAL LETTER D
69451051000101ELATIN CAPITAL LETTER E
70461061000110FLATIN CAPITAL LETTER F
71471071000111GLATIN CAPITAL LETTER G
72481101001000HLATIN CAPITAL LETTER H
73491111001001ILATIN CAPITAL LETTER I
744A1121001010JLATIN CAPITAL LETTER J
754B1131001011KLATIN CAPITAL LETTER K
764C1141001100LLATIN CAPITAL LETTER L
774D1151001101MLATIN CAPITAL LETTER M
784E1161001110NLATIN CAPITAL LETTER N
794F1171001111OLATIN CAPITAL LETTER O
80501201010000PLATIN CAPITAL LETTER P
81511211010001QLATIN CAPITAL LETTER Q
82521221010010RLATIN CAPITAL LETTER R
83531231010011SLATIN CAPITAL LETTER S
84541241010100TLATIN CAPITAL LETTER T
85551251010101ULATIN CAPITAL LETTER U
86561261010110VLATIN CAPITAL LETTER V
87571271010111WLATIN CAPITAL LETTER W
88581301011000XLATIN CAPITAL LETTER X
89591311011001YLATIN CAPITAL LETTER Y
905A1321011010ZLATIN CAPITAL LETTER Z
915B1331011011[LEFT SQUARE BRACKET
925C1341011100\REVERSE SOLIDUS
935D1351011101]RIGHT SQUARE BRACKET
945E1361011110^CIRCUMFLEX ACCENT
955F1371011111_LOW LINE
96601401100000`GRAVE ACCENT
97611411100001aLATIN SMALL LETTER A
98621421100010bLATIN SMALL LETTER B
99631431100011cLATIN SMALL LETTER C
100641441100100dLATIN SMALL LETTER D
101651451100101eLATIN SMALL LETTER E
102661461100110fLATIN SMALL LETTER F
103671471100111gLATIN SMALL LETTER G
104681501101000hLATIN SMALL LETTER H
105691511101001iLATIN SMALL LETTER I
1066A1521101010jLATIN SMALL LETTER J
1076B1531101011kLATIN SMALL LETTER K
1086C1541101100lLATIN SMALL LETTER L
1096D1551101101mLATIN SMALL LETTER M
1106E1561101110nLATIN SMALL LETTER N
1116F1571101111oLATIN SMALL LETTER O
112701601110000pLATIN SMALL LETTER P
113711611110001qLATIN SMALL LETTER Q
114721621110010rLATIN SMALL LETTER R
115731631110011sLATIN SMALL LETTER S
116741641110100tLATIN SMALL LETTER T
117751651110101uLATIN SMALL LETTER U
118761661110110vLATIN SMALL LETTER V
119771671110111wLATIN SMALL LETTER W
120781701111000xLATIN SMALL LETTER X
121791711111001yLATIN SMALL LETTER Y
1227A1721111010zLATIN SMALL LETTER Z
1237B1731111011{LEFT CURLY BRACKET
1247C1741111100|VERTICAL LINE
1257D1751111101}RIGHT CURLY BRACKET
1267E1761111110~TILDE

制御文字一覧(0〜31・127)と意味

制御文字は、テレタイプや通信回線を制御するための文字で、画面には表示されません。「Ctrl」の列は端末での書き方で、Ctrl キーを押しながら番号が 64 大きい文字のキーを押すと、その制御文字が入力されます。3 番なら ^C(Ctrl+C)、27 番の ESC なら ^[ です。

10進16進8進2進略号名称(RFC 20)意味Ctrl
0000000000000NULNull空文字。C の文字列の終端^@
1010010000001SOHStart of Headingヘッダーの開始^A
2020020000010STXStart of Text本文の開始^B
3030030000011ETXEnd of Text本文の終了^C
4040040000100EOTEnd of Transmission伝送の終了^D
5050050000101ENQEnquiry問い合わせ^E
6060060000110ACKAcknowledge肯定応答^F
7070070000111BELBellベル(警告音)^G
8080100001000BSBackspace1 文字戻る^H
9090110001001HTHorizontal Tabulation水平タブ^I
100A0120001010LFLine Feed改行(次の行へ)^J
110B0130001011VTVertical Tabulation垂直タブ^K
120C0140001100FFForm Feed改ページ^L
130D0150001101CRCarriage Return復帰(行頭へ)^M
140E0160001110SOShift Outシフトアウト^N
150F0170001111SIShift Inシフトイン^O
16100200010000DLEData Link Escape伝送制御の拡張^P
17110210010001DC1Device Control 1装置制御 1(XON)^Q
18120220010010DC2Device Control 2装置制御 2^R
19130230010011DC3Device Control 3装置制御 3(XOFF)^S
20140240010100DC4Device Control 4装置制御 4^T
21150250010101NAKNegative Acknowledge否定応答^U
22160260010110SYNSynchronous Idle同期用の空送り^V
23170270010111ETBEnd of Transmission Blockブロックの終了^W
24180300011000CANCancel取り消し^X
25190310011001EMEnd of Medium媒体の終端^Y
261A0320011010SUBSubstitute置換^Z
271B0330011011ESCEscapeエスケープ^[
281C0340011100FSFile Separatorファイル区切り^\
291D0350011101GSGroup Separatorグループ区切り^]
301E0360011110RSRecord Separatorレコード区切り^^
311F0370011111USUnit Separatorユニット区切り^_
1277F1771111111DELDelete削除(紙テープの穴を全部開けて取り消す)^?

RFC 20 は、DEL は厳密には制御文字ではないと注記しています。7 ビットがすべて 1(1111111)なのは、紙テープで間違えた文字の穴を全部開けて消していたためです。

プログラムの文字列では、よく使う制御文字をエスケープ表記で書けます。C 言語で定義されているのは \a(7)、\b(8)、\t(9)、\n(10)、\v(11)、\f(12)、\r(13)で、Python も同じ表記を受け付けます。0 は 8 進数表記の \0、ESC は 16 進数表記の \x1b で書きます。JavaScript には \a がありません。

コード表の読み方:上位 2 ビットで種類が分かる

ASCII の 128 文字は、上位 2 ビットで 32 個ずつ 4 つのブロックに分かれています。

範囲16進上位 2 ビット内容
0〜3100〜1F00制御文字
32〜6320〜3F01空白、数字、記号の大部分
64〜9540〜5F10@、英大文字、[ \ ] ^ _
96〜12760〜7F11`、英小文字、{ | } ~、DEL

この並びから、次の 3 つの性質が出てきます。

  • 大文字と小文字の差は 32。 A は 65(1000001)、a は 97(1100001)で、違うのは 32(16 進の 0x20)のビットだけです。このビットを立てると小文字、落とすと大文字になります。ただし英字 52 文字にしか使えません。[(91)に同じ操作をすると {(123)になります。
  • 数字の値は番号から 48 を引いたもの。 '7' は 55 で、55 − 48 = 7 です。16 進数では 0x30〜0x39 なので、下位 4 ビットがそのまま数字の値です。
  • Ctrl は上位 2 ビットを落とす。 Ctrl+英字は、その英字の番号と 31(0x1F)の論理積です。C は 67 で、67 AND 31 = 3(ETX)になります。端末で Ctrl+M(13)が Enter、Ctrl+I(9)が Tab と同じ働きをするのはこのためです。

日本語環境で ASCII と違うところ

日本で使われてきた文字コードは ASCII を土台にしていますが、いくつか違う点があり、これが円記号や文字化けのトラブルの原因になっています。

0x5C が円記号になる。 日本の文字コード規格 JIS X 0201 のラテン文字集合は、ASCII とほぼ同じですが、0x5C に ¥(円記号)、0x7E に ‾(オーバーライン)を割り当てています(Unicode が公開していた対応表 JIS0201.TXT では 0x5C が U+00A5、0x7E が U+203E)。そのため日本語の Windows のフォントでは、バックスラッシュ \ が ¥ の形で表示されます。C:¥Users と見えるパスも、ファイルの中身は 0x5C です。逆に、ブラウザの Shift_JIS エンコーダー(WHATWG Encoding Standard)は、U+00A5 の ¥ を 0x5C に変換します。

Shift_JIS の「5C 問題」。 Shift_JIS では、漢字やカタカナの 2 バイト目に 0x40〜0xFC(0x7F を除く)が使われるため、2 バイト目が 0x5C(ASCII の \)になる文字があります。「表」は 95 5C、「ソ」は 83 5C、「能」は 94 5C、「予」は 97 5C、「申」は 90 5C です(Python の cp932 コーデックで確認)。Shift_JIS を意識しないプログラムがこの 0x5C をエスケープ記号として取り除くと、「表示」(95 5C 8E A6)は 95 8E A6 になり、CP932 では「侮ヲ」と表示されます。これらは「ダメ文字」と呼ばれてきました。UTF-8 では、複数バイト文字のどのバイトも 128 以上になるので(RFC 3629)、この問題は起きません。

半角カナは ASCII の外。 JIS X 0201 の片仮名集合は 0xA1〜0xDF の 1 バイトで、128 以上なので ASCII ではありません。Shift_JIS の半角カナもこの範囲です。

全角英数字は ASCII ではない。 IME で全角モードのまま入力した A や 1 は、ASCII の A(65)や 1(49)とは別の文字です。Unicode では U+FF01〜U+FF5E に置かれていて、ASCII の 33〜126 に 0xFEE0(65248)を足した番号になります。A は 65 + 65248 = 65313 です。フォームの入力チェックで「半角英数字のみ」を判定するときは、この範囲の文字が混ざっていないかを確認してください。

改行コード CR・LF と Ctrl キー

日本語の環境でも、制御文字でいちばんよく目にするのは改行です。

  • LF(10)と CR(13)。 Linux と macOS のテキストファイルは LF だけ、Windows のテキストファイルは CR と LF の 2 文字で改行します。HTTP/1.1(RFC 9112)やメールの SMTP(RFC 5321)も、行の終わりは CR LF です。Windows で作った CSV やシェルスクリプトを Linux で読むと、行末に CR が残って \r が見えたり、コマンドが見つからないと言われたりするのはこのためです。
  • ESC(27)。 端末の色やカーソル移動を指定するエスケープシーケンス(ECMA-48)の先頭です。ESC [ 3 1 m で文字が赤くなり、ESC [ 0 m で元に戻ります。
  • Ctrl キーで送る文字。 macOS で stty -a を実行すると、intr = ^C、eof = ^D、start = ^Q、stop = ^S、susp = ^Z、erase = ^? と表示されます。Ctrl+C(ETX)でプログラムを中断し、Ctrl+D(EOT)で入力を終え、Ctrl+S と Ctrl+Q(DC3・DC1)で出力を止めて再開し、Backspace キーは DEL を送ります。端末が急に反応しなくなったときは、うっかり Ctrl+S を押していないか確かめてみてください。
  • RS(30)。 JSON テキストシーケンス(RFC 7464)では、JSON の 1 件ごとに先頭へ RS を置きます。FS・GS・RS・US の 4 つの区切り文字は、もともとこうした構造化データのために用意されたものです。

128〜255 は ASCII ではない

1 バイトは 8 ビットですが、ASCII が決めているのは 127 までです。128〜255 の意味は文字コードによって変わるので、「拡張 ASCII」という 1 つの表は存在しません。同じバイト 0x82 でも、Windows-1252 なら ‚(下付きの引用符)、ISO-8859-1 なら見えない C1 制御文字、Shift_JIS なら「あ」(82 A0)などの 2 バイト文字の 1 バイト目です。

ブラウザでは、WHATWG Encoding Standard が iso-8859-1、latin1、us-ascii、ascii というラベルをすべて Windows-1252 の別名として扱います。charset=us-ascii と宣言したページでも、0x80 は € と表示されます。

UTF-8 は ASCII をそのまま含んでいます。ASCII だけで書かれたファイルは、そのまま正しい UTF-8 のファイルです。

ZeroTool の ASCII 変換で確かめる

ASCII 変換器はブラウザの中で双方向に変換します。左の欄に文字を入力して テキスト → ASCII を押すと、1 文字ごとに、選んだ形式で番号が表示されます。

16進数:0x48 0x69 0x21
2進数: 0b1001000 0b1101001 0b100001

2 進数は先頭の 0 を省いて表示するので、!(33)は表の 0100001 ではなく 6 桁の 0b100001 になります。8 桁や 7 桁にそろえたいときは、自分で 0 を補ってください。

ASCII → テキスト は、空白・カンマ・改行で区切った番号を文字に戻します。0x48, 0o151 0b100001 のように番号ごとに接頭辞を変えても読めて、結果は Hi! です。接頭辞のない番号は 10 進数として読みます。基数に合わない文字を含む番号があると何も変換せず、Error: Invalid code: 72abc のように表示します。

ASCII 以外の文字は、バイト列ではなく Unicode のコードポイントで表示されます。全角の ABC1 を 10 進数で変換すると、ASCII の 65 66 67 49 ではなく次の番号になり、全角であることがすぐ分かります。

ABC1  →  65313 65314 65315 65297

同じように「表示」を 16 進数で変換すると 0x8868 0x793A で、これは Unicode の番号です。Shift_JIS のバイト列(95 5C 8E A6)は表示されません。

文字列が ASCII だけか調べる

「半角英数字だけのはずの ID に、見えない全角文字が混ざっていた」という問題は、番号が 128 以上の文字を探せば見つかります。

s = "ID:ABC123"
s.isascii()                                  # False
[(c, ord(c)) for c in s if ord(c) > 127]     # [(':', 65306), ('1', 65297), ('2', 65298), ('3', 65299)]
/[^\x00-\x7F]/.test('ID:ABC123');                 // true
[...'ID:ABC123'].filter((c) => c.codePointAt(0) > 127); // [ ':', '1', '2', '3' ]

str.isascii() は Python 3.7 以降で使えます。全角英数字を半角に直すだけなら、Unicode 正規化の NFKC が使えます。Python の unicodedata.normalize('NFKC', 'ABC1') は 'ABC1' を返します。ゼロ幅スペースのような見えない文字は、見えない文字検出ツールで名前つきで一覧できます。