ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

手作りネットプロトコル工房コミュのASCIIの歴史

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ASCIIの歴史についてかかれたものすごくいいページがあったので訳しています。 まだ終わっていないのですが、途中経過としてアップします。

6/15追記

一応全部訳しおわりました...。 原文を書いている人はどうもネイティブじゃないようなきがしてきています...。結構スペリングが間違ってるし、文章が変で何が言いたいのかよくわからないことも少なくないからです。

でも、ほとんど誰も語らない貴重な情報について説明していることに何も変りはありません。


http://www.lammertbies.nl/comm/info/ascii-characters.html

NUL - ヌル文字
ASCII文字セット中のNUL文字は、元々無視されるべき文字=NOPとして利用することが意図されていた。 これは、紙テープなどの媒体を利用している際、既にあるデータの中にあとからデータを追加したりするときにとても便利な機能だった。 しかし、NUL文字をNUL文字として扱わずに空白として扱かっているプリンタもあった。 その後、C言語で文字列の終端文字として定義されたことにより、NUL文字の重要性は大きく高まった。 NUL文字は、無制限長の文字列を定義する事を可能にした。 それ以前は、PASCALをはじめとする他のほとんどの言語は、配列の前にその配列の長さを数値で保存する事により、文字列の長さを指定していた。(訳注:つまり数値の保存領域サイズによって配列の長さには限界があった。)

SOH - ヘッダ開始
そのコミュニケーションが始まる以前に、既になにかしらのコマンドやメッセージが存在した場合の為に、このSOHは、それぞれのメッセージのヘッダの開始位置を表すために利用される。 ASCII標準が制定された1963年当時の定義では、メッセージ開始(Start Of Message)という名前が利用されていたが、その後最終リリースで ヘッダ開始(start of heading)という名前に変更された。 現在、では、SOHは RS232通信、特にマスタースレーブの設定を行うときにでよく見かける。 マスターからのそれぞれのコマンドは、必ずSOHから始まる。 これは、エラーが発生した場合などであっても、SOHを送信することによって次のコマンドに備えて再同期することが可能となる。それぞれのコマンドの先頭をクリアする事が出来ないと、再同期の実装はとても厄介なものになる。

2 - STX - テキスト開始
3 - ETX - テキスト終了

一般的なプロトコルでは、しばしばメッセージ単位でコミュニケーションする。 そして、そのメッセージ内のコンテント(メッセージ内の主なデータ)にはヘッダ(そのデータに関する付加情報)が付けられているものだ。 そして、そのヘッダはアドレス情報を含んでいる。 このSTXは、コンテントの開始を指定する。 同時に、ヘッダの終了も指定するようになっている。 すなわち、ヘッダ終了を指定するコードは無い。 メッセージ自体の終了はETXによって指定される。 コンテントは、ASCII標準では定義されておらず、その内容はプロトコルに依存する。 面白いことに 1963年の標準ドラフトでは、名前が違った。 STXは、EOA(End Of Address)と呼ばれ、ETXは当初、EOM(End Of Message)と呼ばれていた。 何故だろうか。 それは、元々のドラフトでは、メッセージは常に開始と終了を制御する文字が含まれている、と定義されていたからだ。 新しい定義では、SOHと共に固定長コマンドを送る事だけが許されて、コマンドの終了を表す制御符号は必要とされなかった。 実際のところ、現在我々が見かけるシリアル通信用プロトコルでは、固定長メッセージが送られる時、ヘッダとコンテントを分別しないことがおおい。

4 - EOT - End of transmission
5 - ENQ - Enquiry
6 - ACK - Acknowledgment

7 - BEL - 可聴ベル

このベルコードはとても面白い。 何故なら、これはデータの制御やデバイスの制御に利用されないからだ。 ただ単に、人間の注意を引くために音を出すという目的だけのために利用される。 コンピューターによって利用されるケース、プリンタなどのデバイスで利用されるケース、その両方ともが意図されている。 C言語では、\aが この可聴ベルを表すために利用される。

8 - BS - バックスペース
このバックスペースの機能定義は何度も変更されてきた。 当初は、プリンターやテレタイプで一文字もどるという動作が意図されていた。 例えば、a を生成するために、aBS^ というシーケンスをプリンタに送るのだ。この方法は、もともと機械式のタイプライターがどうやってアクセント文字を扱うかという実際的な動作から取られた方法だ。 しかし、CRTが現れると同時に、当然この方法は、そういうやり方でサポートできなくなった。 よって、現在では、バックスペースは、一文字戻るという動作を表すだけではなく、そこにある文字を削除するという動作も表すようになった。 C言語では、\b が このバックスペースを表す。


9 - HT - 水平タブ
制御文字 HT は、レイアウトする目的のために定義された。 出力デバイスに次のテーブルカラムに進むことを指示する。 テーブルカラムの幅は固定長ではないものの、一般的にはデフォルトとして8が指定されている。 水平タブは、入力時の手間を省くだけでなく、保存デバイスを節約するという目的もあった。 現在では、笑ってしまうようなことだが、是非、ASCII標準が40年前に開発されたものだという事を思い出して欲しい。 当時は、記憶デバイスはとても高価であったうえ、ZIP等の圧縮技術も確立されていなかったのだ。 HTはC言語では \t で表される。


10 - LF - ラインフィード
このラインフィード文字は、長らく間違った方法で利用されてきた文字のひとつだ。 元々 LFは、プリンタのヘッダを一行下に移動することが意図されていた。 そして、次の制御文字 CR が、プリンタのヘッダを一番左に移動することが意図されていたのだ。 これこそが、多くのシリアル通信プロトコルやMS-DOS/Windows等のオペレーティングシステムでで実装されている方法だ。

一方、C言語やUNIXオペレーティングシステムで、この文字は「新しい行」として再定義された。 これは、このラインフィードとキャリッジリターンの両方の意味を含んでもいた。 この文章を読んで文句を言いたくなっただろうか。 しかしながら、CやUNIXでは、プログラムを組むという視点からより自然な方法でこのLFを扱ったといえる。 一方 MS-DOSでは 元々の意味により近い方法で実装したといえる。もしも ラインフィードと新行が元々からASCIIの中で定義されていたとしたらどんなに良かった事だろう。 何故なら、単純なデバイス制御機能として定義されたものが、論理的なテキストのセパレーターとして流用されているわけだから。 このセパレーターとしての流用は本来の使い方ではない。 現在では、人々は LF の方をこの新しいセパレーターとしての機能=新行として使う傾向がある。 また、多くのソフトウェアは、LFのみでも CR/LFの組み合わせでも テキストのセパレーターとして扱う事ができる。 C言語では \n として参照される。


11 - VT - 垂直タブ

この垂直タブは、水平タブと同じ様にレイアウトを行うときの作業量を減らす目的のものだ。 同様に、保存デバイスの利用料を節約するものでもあった。 VTは 次のマークされた行へジャンプする。 しかし、正直なところ、私は、この機能が実装された事を一度も見たことが無い。 ほとんどの場合、 LFの組み合わせが代わりに利用されている。


12 - FF - フォームフィード
このフォームフィード FF と呼ばれる制御文字はプリンタを制御するために設計された。 プリンタは、FFを受信すると次の用紙に移動する。 ターミナル上でのこの動作は実装によって異なる。 あるものは受信と同時にスクリーンをクリアする一方、一般的にはFFはラインフィードの動作を行う。 シェル環境 Bashと Tcshは このFFをスクリーンのクリアとして実装している。 C言語では \f として実装されている。

13 - CR - キャリッジリターン
このキャリッジリターンは、元々プリンタのヘッダを次の行に移動することなく左端に移動するためのものだった。 やがてこのコードは、キーボード上のエンターキーとして割り当てられるようになった。 テキスト入力が終了したことを示すためだ。 しかし、現実的なスクリーン上での表示上の問題として、データ入力後に次の行に移動することを、人々は暗黙のうちに期待するようになった。よって、C言語やUNIXオペレーティングシステムでは、LFを新行として定義しなおしたのだ。 現在多くのソフトは、データを保存する時、入力されたCRを暗黙のうちにLFとして置き換えている。

14 - SO - シフトアウト
15 - SI - シフトイン
60年代初期、ASCIIを定義した人たちは、もしASCIIが他の言語での利用も可能になったとしたらとても価値がある事だろうと考えていた。 このシフトインシフトアウトは、このような動作のために定義されている。 元々、このシフトインシフトアウトは、キリル文字とラテン文字を切り替えるためのものだった。 このシフト文字を利用しているキリルASCII定義は、KOI-7だ。 その後、この制御文字は、プリンタで書体を切り替えるために利用されるようになった。 この用途としては、SOは全角文字、SIは半角文字を選択するために利用された。


16 - DLE - データリンクエスケープ
時折、現在進行中のデータのやり取りの中で、制御文字を送信する必要に迫られる事がある。 それはどういうときかというと、送信される制御文字が制御文字としてではなく、一般的なデータとして扱いたい時などだ。 このASCII標準でのDLEは、このような状況のために定義された。もし、この文字がデータストリームの中で検知されると、それに続く1つかそれ以上の文字は異なる方法で解釈される。このDLEに続く文字列の正確な実装は、続く文字をASCII文字の一部として解釈するのではなく、このコミュニケーション中のストリームを中断できるようにする事だ。 ヘイズコミュニケーションプロトコルと呼ばれるモデムのためのプロトコルでは、データリンクエスケープは、silence+++silence として定義されているのだが、私に言わせれば、これはDLEとして定義された方が良かったはずだ。 何故なら、そうする事によって、空白のコミュニケーションを埋め込む必要が無くなるし、より既にある標準にフィットするからだ。 しかし、このヘイズ氏は、違う方法で定義してしまったし、+++ シーケンスは、DLEとは比較にならないほど頻繁に利用されるようになってしまった。

17 - DC1 - Device control 1 / XON - 送信オン
このアスキー制御文字は元々DC1として定義されていたのだが、シリアル通信でのソフトウェアフローコントロールで利用されるXONコードとしてのほうが、よりよく知られている。 このコードの主な用途は、他でもない制御文字 XOFFで停止した通信を再開することだ。 かつてシリアル端末で仕事をしていたような人たちの多くは、データエラーが発生した時などに、CTRL+Qを押すと問題が解決する事がある事を覚えている筈だ。 これは、CTRL+Qが、XON制御文字を出力するからなのだが、このXON制御文字は、ブロックされたまま、ほったらかしになっている通信を解除する。 こういう状況は、端末やホストコンピューターが何かの拍子に通信エラーによって発生した誤データ文字をXOFFとして解釈してしまったときに発生する。

18 - DC2 - Device control 2
19 - DC3 - Device control 3 / XOFF - Transmission off
20 - DC4 - Device control 4

21 - NAK - Negative acknowledgment
22 - SYN - Synchronous idle
23 - ETB - End of transmission block
24 - CAN - Cancel

25 - EM - 中間終了
EMは、シリアルストレージデバイス(直列方保存装置) で利用される。 シリアルストレージデバイスとは、紙テープや、電磁テープのリールなどの事だ。 EMは、論理的なデータの終了を示す。 当然、物理的なデータストレージデバイスの終了である必要は無い。

26 - SUB - Substitute character

27 - ESC - エスケープ

このエスケープ文字はアスキー標準上で利用できる技術として、ボブベマーによって発明された。 エスケープ文字は、拡張されたコントロールのシーケンスパターンの開始を示すために使われる。 こうすることで、考えられるすべてのパターンの制御文字をアスキー標準として取り込む必要がなくなったわけだ。 新しい技術は、新しい制御文字を要求するものだ。 その要求にこたえるため、このESCは作られた。 ESCは、それに続く複数の文字からなるコマンドの開始を表す。 もしも、ESC がもともとのオリジナルのアスキー定義に含まれなかったとしたら、恐らく他の標準がASCIIに取って代わられていただろう。 それぐらいESCは重要な定義だ。 このESCは、必要であれば標準から文字通り逃げ出す方法を与えてくれる。


28 - FS - ファイル区切り

このファイル区切りを表すFSは、とても面白い制御文字だ。 何故なら、1960年代にどのようにコンピューターが利用されていたのかを垣間見せてくれるからだ。 現在ではRAMや磁気ディスクなどのランダムアクセスデバイスは、極めて一般的なものとなったが、しかしアスキー標準が制定された当時は、ほとんどの記録装置はランダムアクセスではなくシリアル(順次)アクセスだった。 ここでいうシリアル(順次)というのは、通信方法だけのことを言っているのではない。 保存方法も同様にシリアル(順次)式だったのだ。 例えばパンチカードや、紙テープ・磁気テープなどがそれに該当する。 そういう状況では、そういう一文字でファイルの境目を表せる制御文字の存在は大きかった。 このFSがそれだ。

29 - GS - グループ区切り
データ保存処理は、いくつかの特殊な制御文字をアスキーに取り入れる原因となった張本人だ。 データベースはほとんどの場合、テーブルを持つ。 そして、その中に沢山のレコードを持つ。 あるテーブル内のすべてのレコードは同じタイプだが、違うテーブルに入っているレコードは当然違うタイプを持っている。GSは、このテーブルを区切るための制御文字だった。


30 - RS - レコード区切り
グループ(テーブル)内でレコードを区切るために使われた。

31 - US - ユニット区切り
記録デバイス中で最も小さいデータの区切りのことを、アスキー定義ではユニットと呼ぶ。 現在ではフィールドと呼ぶ。 ユニット区切りは、これらのフィールドを、シリアル(順次)アクセスデータ保存装置の中で、区切る役割を担っている。 現在、多くのデータベースの実装では、フィールドは固定長である事を要求している。 多くの場合、フィールド区切りは不要であるし、非常に大きい領域を必要ともする。 このUSを利用する事により、すべてのフィールドで可変長を扱えるようになった。 1960年代のように、保存場所が高価でとても限られたスペースしかないような場合、これは保存場所を節約するためにとても良い方法だった。 一方、現在は、シリアル順次アクセス保存装置とは比べ物にならないほど便利なRAMやディスクで運用されるテーブルを使っているのだ。近代的なSQLデータベースを紙テープや磁気テープの元で走らせるという状況は、ちょっと私には想像できない...。


32 - SP - 空白

空白が制御文字だと言われると異論を唱える人もいるかもしれない。 一般的なテキストとして広く利用されているわけだし。しかし、水平タブやバックスペースがアスキー上で制御文字だと言われている以上、私は、空白、又はフォワードスペースを制御文字として呼ぶほうが自然だと考える。 結局のところSPはそれ自身で何の文字も表していないが、単に出力デバイスのヘッダ位置を勧めたり、現在のフィールドの情報をクリアしたりする。 多くのワードプロセッサのようなアプリケーションでは、空白は行を折り返すきっかけでもある。 また、ウェブブラウザでは、複数の連続した空白は、単一の空白としてまとめて出力される。これらの事実を見ると、SPが空白という一つの文字を表しているだけではなく、デバイスやアプリケーションにある特定の情報を伝える役割を果たしているのだということを思わざるを得ない。


127 - DEL - 削除

何故、ほとんどの制御文字列が低い値にセットされているのに、このDELだけが127に割り当てられているのか、疑問をもたれる方もいるかもしれない。 これは、実は、紙テープ上のデータを削除するために定義されたものだからなのだ。 当時、ほとんどのテープで、7つの穴を利用する方式が採用されていた。この127という値は、この7つのビットすべてが1になっている状態を表しているのだ。もしも紙テープ上のあるバイトを削除したい場合は、すべての穴をパンチすれば値は127となりDELとなり、めでたく削除される。

コメント(3)

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

手作りネットプロトコル工房 更新情報

手作りネットプロトコル工房のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング