Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ASCII

コンピュータが2進数で動作しているとしたら、文字や単語をどうやって保存しているのだろうか。 それを実現するために、私たちは文字に数を割り当てている。 これは文字コード化と呼ばれる。

文字コード化がどのように機能するかを理解するために、簡単な例を作ってみよう。 まず、アルファベットに1から26までの数字を割り当てる。

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z

簡単な暗号メッセージを書くには、文字を数字に置き換える。 たとえば 8 5 12 12 15 である。 数字を使うことで、h e l l o という単語を作り出すことができる。

しかし、大文字と小文字のアルファベット、数字、句読点まで含めた英語のアルファベット全体を表すには、26文字だけでは足りない。 そこで生まれたのが、コンピュータ向けの初期の文字コード化規格のひとつであるAmerican Standard Code for Information Interchange(ASCII)である。

このチュートリアルで扱う内容:

  • ASCIIの簡単な歴史
  • 10進数、2進数、16進数をASCIIに変換する方法

参考になるチュートリアル:

このガイドを読み始める前に、知っておくとよい概念がいくつかある。

  • 2進数:コンピュータが数をどのように保存しているかを知っておくと、その数を文字に変換する際に役立つ
  • 16進数:16進数は、2進数を4ビットずつのまとまりで表すためによく使われる
  • Installing Arduino IDE(Arduino IDEのインストール):ASCII文字を表示してみるには、Arduinoを使うのがよい方法である

歴史

アメリカ規格協会(ASA、現在のアメリカ規格協会ANSI)は、1960年10月6日にASCIIの策定に着手した。 この符号化方式は、エミール・ボードーが考案した5ビットの電信符号に起源を持つ。 委員会は最終的に、ASCIIを7ビットの符号として採用することを決めた。

7ビットあれば128文字を表現できる。 この符号化方式にはアメリカ英語の文字と記号だけが選ばれたが、7ビットにしたことで、(たとえば8ビットにする場合と比べて)データ伝送にかかるコストを抑えることができた。

ASCIIの最初の32文字は、制御文字として予約されている。 これらの文字は、プリンターのような他の機器に特別な指示を伝えるために使われた。 たとえば、改行したり、文字を削除したり、機器によってはベルを鳴らしたりすることができた(Teletype Model 33 ASRなどがその例である)。

ASAは1963年に最初のバージョンのASCIIを発表し、1967年に改訂した。 この規格への最後の大きな更新は1986年に行われた。 ASCIIが最初に商用で使われたのは、AT&T(American Telephone & Telegraph)のTWX(テレタイプライター交換)ネットワークだった。

1968年3月11日、リンドン・B・ジョンソン大統領は、アメリカ連邦政府のすべてのコンピュータがASCIIをサポートすることを義務付け、これによりASCIIはアメリカのコンピュータ史における確固たる地位を築いた。

当時は国際電信アルファベット2号(ITA2)のような他の符号化方式も存在していたが、ASCIIはすぐにアメリカ英語の符号化における標準となった。 ASCIIは、2007年にUTF-8に追い抜かれるまで、インターネット上でもっとも一般的な符号化方式だった。

ASCIIテーブル

ある文字のASCII値を調べるには、ASCIIテーブルを参照するのが一般的である。 ASCIIテーブルは、それぞれの文字を0から127までの割り当てられた値と対応付けている。

制御文字

制御文字は、ASCIIテーブルの最初の32文字を占めている。 これらの文字は表示されることを意図しておらず、代わりにプリンターのような他の機器にコマンドの指示を送るために使われる。 非常に古いシステム(12ビットのPDP-8など)を扱う可能性もあるため、念のため8進数での表記も併記しておく。

10進2進8進16進文字説明
00000 000000000NULヌル文字
10000 000100101SOHヘディング開始
20000 001000202STXテキスト開始
30000 001100303ETXテキスト終了
40000 010000404EOT転送終了
50000 010100505ENQ照会
60000 011000606ACK肯定応答
70000 011100707BELベル
80000 100001008BSバックスペース
90000 100101109TAB水平タブ
100000 10100120ALF改行
110000 10110130BVT垂直タブ
120000 11000140CFF改ページ
130000 11010150DCR復帰
140000 11100160ESOシフトアウト
150000 11110170FSIシフトイン
160001 000002010DLEデータリンクエスケープ
170001 000102111DC1装置制御1
180001 001002212DC2装置制御2
190001 001102313DC3装置制御3
200001 010002414DC4装置制御4
210001 010102515NAK否定応答
220001 011002616SYN同期アイドル
230001 011102717ETB伝送ブロック終了
240001 100003018CAN取り消し
250001 100103119EM媒体終了
260001 10100321ASUB置換
270001 10110331BESCエスケープ
280001 11000341CFSファイル区切り
290001 11010351DGSグループ区切り
300001 11100361ERSレコード区切り
310001 11110371FUSユニット区切り
1270111 11111777FDEL削除

表示可能文字

ASCIIの符号化方式には95個の表示可能文字がある。 「space」の文字は、表示可能な空白(半角スペース)を表していることに注意してほしい。

10進2進8進16進文字
320010 000004020(半角スペース)
330010 000104121!
340010 001004222
350010 001104323#
360010 010004424$
370010 010104525%
380010 011004626&
390010 011104727
400010 100005028(
410010 100105129)
420010 10100522A*
430010 10110532B+
440010 11000542C,
450010 11010552D-
460010 11100562E.
470010 11110572F/
48〜570011 0000〜0011 1001060〜07130〜390〜9
580011 10100723A:
590011 10110733B;
600011 11000743C<
610011 11010753D=
620011 11100763E>
630011 11110773F?
640100 000010040@
65〜900100 0001〜0101 1010101〜13241〜5AA〜Z
910101 10111335B[
920101 11001345C\
930101 11011355D]
940101 11101365E^
950101 11111375F_
960110 000014060`
97〜1220110 0001〜0111 1010141〜17261〜7Aa〜z
1230111 10111737B{
1240111 11001747C|
1250111 11011757D}
1260111 11101767E~

実際に試してみる

ASCII符号化を使って何かを表示してみたいなら、Arduinoで試すことができる。 Arduinoを始めるには、Installing Arduino IDEのチュートリアルを参照してほしい。

Arduino IDEを開き、次のコードを貼り付けてみよう。

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.write(0x48); // H
  Serial.write(0x65); // e
  Serial.write(0x6C); // l
  Serial.write(0x6C); // l
  Serial.write(0x6F); // o
  Serial.write(0x21); // !
  Serial.write(0x0A); // \n

  delay(1000);
}

これをArduinoで実行し、シリアルコンソールを開いてみよう。 「Hello!」が何度も表示されるはずである。

ここでSerial.print()ではなくSerial.write()を使っていることに注目してほしい。 write()コマンドは、シリアル回線に生のバイトをそのまま送信する。 一方print()は、その数値を解釈しようとし、ASCII符号化された文字列を送信しようとする。 たとえばSerial.print(0x48)は、コンソールに72と表示してしまう。

また、「ラインフィード」の制御文字である0x0AというASCII文字を使っていることにも注目してほしい。 これは、プリンター(ここではコンソール)に次の行へ進むよう指示する文字である。 「Enter」キーを押すのとよく似た働きをする。

まとめ

文字コード化の方式は数多く存在する。 World Wide Webでもっとも普及している符号化方式はUTF-8である。 2016年6月の時点で、UTF-8はすべてのウェブページの87%で使われている。

UTF-8はASCIIとの後方互換性を持っており、最初の128文字はASCIIとまったく同じである。 UTF-8は、ラテン文字、ギリシャ文字、キリル文字、アラビア文字、中国語、韓国語、日本語の文字を含む、現代のほとんどの書き言葉の文字を、2バイト、3バイト、4バイトを使って符号化できる。

基本的なASCII符号化の知識は、シリアルターミナルを扱う際にも役立つ。 数あるシリアルターミナルプログラムの使い方については、Serial Terminal Basics(シリアルターミナルの基礎)のチュートリアルを参照してほしい。

タグ: 通信、コンピュータ工学、概念、プログラミング


出典:ASCII(SparkFun Learn)を日本語に翻訳し、再構成した。 原文は CC BY-SA 4.0 ライセンスで公開されており、本ページも同ライセンスの下で提供する。