ASCII (American Standard Code for Information Interchange, アスキー)とは、文字コードの一つである。
概要
英語で使われる文字・記号や制御文字を7ビットで表したものである。
現在使われている様々な文字コードの基礎となっており、それらの文字コードでは0x00から0x7Fまでの文字はASCIIと互換性を持たせていることが多い。UTF-8に至っては、ASCII文字だけならASCIIと1ビットに至るまで完全に一致する。
なぜ1文字1バイト=8ビットではないのか
制定された1963年にはまだCPUすら存在せず(4ビットプロセッサのIntel 4004の登場が1971年)、1ビットすら貴重だった。アルファベット大文字小文字+数字で62文字なので6ビットに収める文字コードも存在したとか。
その後データの扱いがバイト単位になってからも、通信で残りの1ビットを通信エラーのチェックにあてるようになり、7ビットのASCIIが生き残ることになった。
データ通信への影響
上記のため、海外から日本に日本語でメールする際など、7ビットデータしか通過できない欧米のインターネット回線で日本語のデータを送ると文字化けするという事態が頻発していた。
日本語がメールで送れないのはローマ字に置き換えて我慢できないこともないが、画像などのバイナリファイルは我慢して済む問題でもないということで、8ビットのデータをASCIIの7ビット範囲内に収めてメール送信を可能にするQuoted-printableやuuencodeなどの符号化方式が生み出された。そのうちBase64はデータ交換形式として、パーセントエンコーディングはURLのパス部分として、メール以外の場面でも広く使われている(メール以外ではPunycodeなど別の方式も生み出されている)。
使用文字
ASCIIに含まれる文字は0x00から0x1Fと0x7Fが制御文字、0x20がスペース、0x21から0x7Eが文字・記号となっている。
制定が1963年と古いため、制御文字には電動機械式タイプライター(テレタイプ端末)や古いコンピュータが前提とされており、現在では使われていない文字が多い。
コード表
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00 | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
10 | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
20 | SP | ! | " | # | $ | % | & | ' | ( | ) | * | + | , | - | . | / |
30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
40 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
50 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
60 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
70 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
※フォントの関係で、0x5C \ で円記号が表示されているかもしれないが、正しくは半角のバックスラッシュ \ である。他にも日本語以外のフォントが使用されている場合などで異なる文字が表示されている可能性がある。
数字は16進数で、横方向に0x01の位、縦方向に0x10の位が大きくなるように表している。例えば表の 'A' の文字であれば、0x40 + 0x01 = 0x41 = 65 が割り当てられている。
大文字と小文字は32だけ離れているので、大文字 ↔ 小文字はの変換は2進数で32の位のビットを反転すれば済むようになっている。ビット演算(ビットごとに論理演算する)だと排他的論理和を用いて、例えば 'A' = 100 0001(2) の場合は、 100 0001(2) xor 010 0000(2) = 110 0001(2) = 'a' と書ける。この方法だと大文字 → 小文字と小文字 → 大文字の変換を場合分けせずに統一した式で定義することができる。
よく使う制御文字
- 0x00 NUL
- ヌル(null)。何も書かれていないことを表す空文字。すべてのビットが0であるため、磁気テープやハードディスクなどの記録媒体で言えば、物理的にはデータが何も記録されていない状態となる。
- C言語などでは文字列の終端に付けて、これ以降に文字列が続かないことを表す。
- 0x08 BS
- バックスペース。元の意味は「印字ヘッドを1文字後退する」であり、タイプライターではアクセント記号などの重ね打ち目的で使用された(例:「à」を打つには「a」→BS→「`」の順でタイプ、「ø」を打つには「o」→BS→「/」の順でタイプ、文字の下に下線を引くにはBSで戻ってから「_」をタイプするなど)。
- コンピュータの時代に入ると重ね打ちができなくなったため、直前の文字を削除する機能に変化した。古いテキストエディタなどで表示されていたこの文字の代用表記である "^H" をわざと用いて、「わた^H^H春香さん」のように打ち消し線の代わりとして用いることがあった。(→インターネット老人会)
- なお、古くは実際に「Ctrl+H」を入力することでこのバックスペースを入力することができたため、代用文字として「^H」(Ctrl+Hを表す表記)が用いられるようになった。
- プリンタに送る制御文字としては、ドットインパクトプリンタやインクリボンを用いるラインプリンタの時代まで制御文字として生き残っていた。
- →詳細は「バックスペース」記事および「^H」記事を参照
- 0x09 HT
- 水平タブ。Tabキーで入力される。tab とは table の意味で、もともと表をつくるための文字である。
- Microsoft Wordなどの文書作成ソフトでは、「└」のような記号(テキスト編集エリア外にあるルーラーと呼ばれる領域にある)を左右に動かしてタブの位置を自由に指定できるものもあるが、タイプライターではタブストップと呼ばれるレバーを左右に動かして物理的にタブ位置を制御していた。
- 現在でもテキストエディタ等の仕様によりスペース4個分のタブスペースや8個分などで設定され、特にプログラムのインデント等で利用されている。
- 「水平」タブの他に「垂直」タブ(0x0B VT)も存在するが、あまり使われなかったらしい。
- 0x0A LF
- ラインフィード(改行)。現代の我々が想像する改行とは異なり、タイプライターやテレタイプ(遠隔式タイプライター)の時代は「印字ヘッドを垂直方向に次の行に進める(行頭には戻らない)」挙動だった。過去にはMacとWindows、UNIX Like OSなどで挙動が違い、テキストデータの表示が崩れることがあった。
- これもプリンタに送る制御文字としては長く残っていたもののひとつ。ページプリンタが主流となった現在ではテキストエディタ上の単なる改行コードとしてのみ扱われている。
- 0x0D CR
- キャリッジリターン。元の意味は「印字ヘッドを行の先頭に復帰する」挙動であり、CR単体では同じ行に重ね打ちすることができた。そのため、現代の我々が想像する改行は、CRとLFを組み合わせることで実現していた。
- その名残から、コンピュータの時代に入ってからも「CR+LF」の2文字で改行を表すシステムが存在する(Windowsなど)。ちなみに「LF+CR」の順番ではない理由は、1行の縦幅だけ紙送りすればいいLFに対して1行の横幅まるまる印字ヘッドを移動させるCRのほうが時間がかかるため、テレタイプなどでは次の文字が印字されないように時間を稼ぐ必要があったからである。
- 「LF」のみで改行を表すシステム(macOS、LinuxなどのUNIX Like OS)、「CR」のみで改行を表すシステム(Mac OS 9以前など)も存在するため、ファイルのやりとりの際には相手の環境で改行が正しく反映されているか注意が必要である。
- こちらもプリンタ制御文字として比較的長く残っていた。ページプリンタが主流となった現在ではテキストエディタ上の単なる改行コードとしてのみ扱われている。
- 0x20 SP
- スペース。英単語を区切る際などに用いる。
- タイプライターの時代は「印字ヘッドを1文字進める」という意味を持ち、バックスペースの逆の挙動を持つ制御文字として扱われていた。現在では単なる文字として扱われている。
- 0x7F DEL
- デリート(削除)。上記コード表にてDELだけが他の制御文字と離れたところにあるのを不審に思う人も多いと思うが、パンチカード(?!)に打ち間違えた文字を削除する時に、開けた穴を塞ぐことはできないので全てのビットに穴を開けて1にしていた時代の名残らしい。なにしろ制定されたのは1963年である。大事なことなので(ry
- 似たような理由で0x00をNULにしたかったので、前に集めても後ろに集めても制御コードを連続した単一領域に収めることは不可能であった。
- 現代のコンピュータでは開けた穴の心配をする必要もないため、カーソル直後の文字を削除する機能にその名を残している。
その他の制御文字
- 0x07 BEL
- ベル(bell)。通信相手の端末に備わるベル(電鈴)やブザー音を鳴らすことができ、通信先のコンピュータの近くにいる人間を呼び出すために使われていた。現代ではまったくもって不要であるが、OSによってはエラー音を鳴らす機能として今でも生き残っていたりする(ターミナルが使える人は「echo ^G(ctrl+G)」と入力してみよう)。コンピュータ普及黎明期にはこのBELを表示させる(鳴らす)ことでゲームの効果音とするケースもあった。
上記以外の制御文字については編集者が飽きてしまったためこちらに詳しい解説があるので参照してほしい。