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 名 |
|---|---|---|---|---|---|
| 32 | 20 | 040 | 0100000 | (空白) | SPACE |
| 33 | 21 | 041 | 0100001 | ! | EXCLAMATION MARK |
| 34 | 22 | 042 | 0100010 | " | QUOTATION MARK |
| 35 | 23 | 043 | 0100011 | # | NUMBER SIGN |
| 36 | 24 | 044 | 0100100 | $ | DOLLAR SIGN |
| 37 | 25 | 045 | 0100101 | % | PERCENT SIGN |
| 38 | 26 | 046 | 0100110 | & | AMPERSAND |
| 39 | 27 | 047 | 0100111 | ' | APOSTROPHE |
| 40 | 28 | 050 | 0101000 | ( | LEFT PARENTHESIS |
| 41 | 29 | 051 | 0101001 | ) | RIGHT PARENTHESIS |
| 42 | 2A | 052 | 0101010 | * | ASTERISK |
| 43 | 2B | 053 | 0101011 | + | PLUS SIGN |
| 44 | 2C | 054 | 0101100 | , | COMMA |
| 45 | 2D | 055 | 0101101 | - | HYPHEN-MINUS |
| 46 | 2E | 056 | 0101110 | . | FULL STOP |
| 47 | 2F | 057 | 0101111 | / | SOLIDUS |
| 48 | 30 | 060 | 0110000 | 0 | DIGIT ZERO |
| 49 | 31 | 061 | 0110001 | 1 | DIGIT ONE |
| 50 | 32 | 062 | 0110010 | 2 | DIGIT TWO |
| 51 | 33 | 063 | 0110011 | 3 | DIGIT THREE |
| 52 | 34 | 064 | 0110100 | 4 | DIGIT FOUR |
| 53 | 35 | 065 | 0110101 | 5 | DIGIT FIVE |
| 54 | 36 | 066 | 0110110 | 6 | DIGIT SIX |
| 55 | 37 | 067 | 0110111 | 7 | DIGIT SEVEN |
| 56 | 38 | 070 | 0111000 | 8 | DIGIT EIGHT |
| 57 | 39 | 071 | 0111001 | 9 | DIGIT NINE |
| 58 | 3A | 072 | 0111010 | : | COLON |
| 59 | 3B | 073 | 0111011 | ; | SEMICOLON |
| 60 | 3C | 074 | 0111100 | < | LESS-THAN SIGN |
| 61 | 3D | 075 | 0111101 | = | EQUALS SIGN |
| 62 | 3E | 076 | 0111110 | > | GREATER-THAN SIGN |
| 63 | 3F | 077 | 0111111 | ? | QUESTION MARK |
| 64 | 40 | 100 | 1000000 | @ | COMMERCIAL AT |
| 65 | 41 | 101 | 1000001 | A | LATIN CAPITAL LETTER A |
| 66 | 42 | 102 | 1000010 | B | LATIN CAPITAL LETTER B |
| 67 | 43 | 103 | 1000011 | C | LATIN CAPITAL LETTER C |
| 68 | 44 | 104 | 1000100 | D | LATIN CAPITAL LETTER D |
| 69 | 45 | 105 | 1000101 | E | LATIN CAPITAL LETTER E |
| 70 | 46 | 106 | 1000110 | F | LATIN CAPITAL LETTER F |
| 71 | 47 | 107 | 1000111 | G | LATIN CAPITAL LETTER G |
| 72 | 48 | 110 | 1001000 | H | LATIN CAPITAL LETTER H |
| 73 | 49 | 111 | 1001001 | I | LATIN CAPITAL LETTER I |
| 74 | 4A | 112 | 1001010 | J | LATIN CAPITAL LETTER J |
| 75 | 4B | 113 | 1001011 | K | LATIN CAPITAL LETTER K |
| 76 | 4C | 114 | 1001100 | L | LATIN CAPITAL LETTER L |
| 77 | 4D | 115 | 1001101 | M | LATIN CAPITAL LETTER M |
| 78 | 4E | 116 | 1001110 | N | LATIN CAPITAL LETTER N |
| 79 | 4F | 117 | 1001111 | O | LATIN CAPITAL LETTER O |
| 80 | 50 | 120 | 1010000 | P | LATIN CAPITAL LETTER P |
| 81 | 51 | 121 | 1010001 | Q | LATIN CAPITAL LETTER Q |
| 82 | 52 | 122 | 1010010 | R | LATIN CAPITAL LETTER R |
| 83 | 53 | 123 | 1010011 | S | LATIN CAPITAL LETTER S |
| 84 | 54 | 124 | 1010100 | T | LATIN CAPITAL LETTER T |
| 85 | 55 | 125 | 1010101 | U | LATIN CAPITAL LETTER U |
| 86 | 56 | 126 | 1010110 | V | LATIN CAPITAL LETTER V |
| 87 | 57 | 127 | 1010111 | W | LATIN CAPITAL LETTER W |
| 88 | 58 | 130 | 1011000 | X | LATIN CAPITAL LETTER X |
| 89 | 59 | 131 | 1011001 | Y | LATIN CAPITAL LETTER Y |
| 90 | 5A | 132 | 1011010 | Z | LATIN CAPITAL LETTER Z |
| 91 | 5B | 133 | 1011011 | [ | LEFT SQUARE BRACKET |
| 92 | 5C | 134 | 1011100 | \ | REVERSE SOLIDUS |
| 93 | 5D | 135 | 1011101 | ] | RIGHT SQUARE BRACKET |
| 94 | 5E | 136 | 1011110 | ^ | CIRCUMFLEX ACCENT |
| 95 | 5F | 137 | 1011111 | _ | LOW LINE |
| 96 | 60 | 140 | 1100000 | ` | GRAVE ACCENT |
| 97 | 61 | 141 | 1100001 | a | LATIN SMALL LETTER A |
| 98 | 62 | 142 | 1100010 | b | LATIN SMALL LETTER B |
| 99 | 63 | 143 | 1100011 | c | LATIN SMALL LETTER C |
| 100 | 64 | 144 | 1100100 | d | LATIN SMALL LETTER D |
| 101 | 65 | 145 | 1100101 | e | LATIN SMALL LETTER E |
| 102 | 66 | 146 | 1100110 | f | LATIN SMALL LETTER F |
| 103 | 67 | 147 | 1100111 | g | LATIN SMALL LETTER G |
| 104 | 68 | 150 | 1101000 | h | LATIN SMALL LETTER H |
| 105 | 69 | 151 | 1101001 | i | LATIN SMALL LETTER I |
| 106 | 6A | 152 | 1101010 | j | LATIN SMALL LETTER J |
| 107 | 6B | 153 | 1101011 | k | LATIN SMALL LETTER K |
| 108 | 6C | 154 | 1101100 | l | LATIN SMALL LETTER L |
| 109 | 6D | 155 | 1101101 | m | LATIN SMALL LETTER M |
| 110 | 6E | 156 | 1101110 | n | LATIN SMALL LETTER N |
| 111 | 6F | 157 | 1101111 | o | LATIN SMALL LETTER O |
| 112 | 70 | 160 | 1110000 | p | LATIN SMALL LETTER P |
| 113 | 71 | 161 | 1110001 | q | LATIN SMALL LETTER Q |
| 114 | 72 | 162 | 1110010 | r | LATIN SMALL LETTER R |
| 115 | 73 | 163 | 1110011 | s | LATIN SMALL LETTER S |
| 116 | 74 | 164 | 1110100 | t | LATIN SMALL LETTER T |
| 117 | 75 | 165 | 1110101 | u | LATIN SMALL LETTER U |
| 118 | 76 | 166 | 1110110 | v | LATIN SMALL LETTER V |
| 119 | 77 | 167 | 1110111 | w | LATIN SMALL LETTER W |
| 120 | 78 | 170 | 1111000 | x | LATIN SMALL LETTER X |
| 121 | 79 | 171 | 1111001 | y | LATIN SMALL LETTER Y |
| 122 | 7A | 172 | 1111010 | z | LATIN SMALL LETTER Z |
| 123 | 7B | 173 | 1111011 | { | LEFT CURLY BRACKET |
| 124 | 7C | 174 | 1111100 | | | VERTICAL LINE |
| 125 | 7D | 175 | 1111101 | } | RIGHT CURLY BRACKET |
| 126 | 7E | 176 | 1111110 | ~ | TILDE |
制御文字一覧(0〜31・127)と意味
制御文字は、テレタイプや通信回線を制御するための文字で、画面には表示されません。「Ctrl」の列は端末での書き方で、Ctrl キーを押しながら番号が 64 大きい文字のキーを押すと、その制御文字が入力されます。3 番なら ^C(Ctrl+C)、27 番の ESC なら ^[ です。
| 10進 | 16進 | 8進 | 2進 | 略号 | 名称(RFC 20) | 意味 | Ctrl |
|---|---|---|---|---|---|---|---|
| 0 | 00 | 000 | 0000000 | NUL | Null | 空文字。C の文字列の終端 | ^@ |
| 1 | 01 | 001 | 0000001 | SOH | Start of Heading | ヘッダーの開始 | ^A |
| 2 | 02 | 002 | 0000010 | STX | Start of Text | 本文の開始 | ^B |
| 3 | 03 | 003 | 0000011 | ETX | End of Text | 本文の終了 | ^C |
| 4 | 04 | 004 | 0000100 | EOT | End of Transmission | 伝送の終了 | ^D |
| 5 | 05 | 005 | 0000101 | ENQ | Enquiry | 問い合わせ | ^E |
| 6 | 06 | 006 | 0000110 | ACK | Acknowledge | 肯定応答 | ^F |
| 7 | 07 | 007 | 0000111 | BEL | Bell | ベル(警告音) | ^G |
| 8 | 08 | 010 | 0001000 | BS | Backspace | 1 文字戻る | ^H |
| 9 | 09 | 011 | 0001001 | HT | Horizontal Tabulation | 水平タブ | ^I |
| 10 | 0A | 012 | 0001010 | LF | Line Feed | 改行(次の行へ) | ^J |
| 11 | 0B | 013 | 0001011 | VT | Vertical Tabulation | 垂直タブ | ^K |
| 12 | 0C | 014 | 0001100 | FF | Form Feed | 改ページ | ^L |
| 13 | 0D | 015 | 0001101 | CR | Carriage Return | 復帰(行頭へ) | ^M |
| 14 | 0E | 016 | 0001110 | SO | Shift Out | シフトアウト | ^N |
| 15 | 0F | 017 | 0001111 | SI | Shift In | シフトイン | ^O |
| 16 | 10 | 020 | 0010000 | DLE | Data Link Escape | 伝送制御の拡張 | ^P |
| 17 | 11 | 021 | 0010001 | DC1 | Device Control 1 | 装置制御 1(XON) | ^Q |
| 18 | 12 | 022 | 0010010 | DC2 | Device Control 2 | 装置制御 2 | ^R |
| 19 | 13 | 023 | 0010011 | DC3 | Device Control 3 | 装置制御 3(XOFF) | ^S |
| 20 | 14 | 024 | 0010100 | DC4 | Device Control 4 | 装置制御 4 | ^T |
| 21 | 15 | 025 | 0010101 | NAK | Negative Acknowledge | 否定応答 | ^U |
| 22 | 16 | 026 | 0010110 | SYN | Synchronous Idle | 同期用の空送り | ^V |
| 23 | 17 | 027 | 0010111 | ETB | End of Transmission Block | ブロックの終了 | ^W |
| 24 | 18 | 030 | 0011000 | CAN | Cancel | 取り消し | ^X |
| 25 | 19 | 031 | 0011001 | EM | End of Medium | 媒体の終端 | ^Y |
| 26 | 1A | 032 | 0011010 | SUB | Substitute | 置換 | ^Z |
| 27 | 1B | 033 | 0011011 | ESC | Escape | エスケープ | ^[ |
| 28 | 1C | 034 | 0011100 | FS | File Separator | ファイル区切り | ^\ |
| 29 | 1D | 035 | 0011101 | GS | Group Separator | グループ区切り | ^] |
| 30 | 1E | 036 | 0011110 | RS | Record Separator | レコード区切り | ^^ |
| 31 | 1F | 037 | 0011111 | US | Unit Separator | ユニット区切り | ^_ |
| 127 | 7F | 177 | 1111111 | DEL | Delete | 削除(紙テープの穴を全部開けて取り消す) | ^? |
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〜31 | 00〜1F | 00 | 制御文字 |
| 32〜63 | 20〜3F | 01 | 空白、数字、記号の大部分 |
| 64〜95 | 40〜5F | 10 | @、英大文字、[ \ ] ^ _ |
| 96〜127 | 60〜7F | 11 | `、英小文字、{ | } ~、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' を返します。ゼロ幅スペースのような見えない文字は、見えない文字検出ツールで名前つきで一覧できます。