見出し画像

ASCIIコードは60歳

そもそも文字にコードを割り当てるなんて、コンピュータを作るメーカーが、それこそ適当に決めていたもので、違うコンピュータとデータを交換するなんて言うことは考えてもいませんでした。

そんな昔、多く使われていたのはたくさん売れていたIBM360の文字コードであるEBCDICでした。IBMは360発売に先立って1963年にこのコードを定めたので、もう今年で還暦を迎えるコードなわけです。

EBCDIC

この動きにANSI(当時はASAだった)は、特定の企業がコードを決めるのはアカンと考えたのか、やはり1963年にASCIIを制定しました。

ASCII

ASCIIというのは”American Standard Code for Information Interchange”の頭文字を採ったもので日本語では「情報交換用米国標準コード」と訳されます。つまるところ米国に於いての標準コードであって、ちっとも国際的なものではないことがポイントです。

このコードには当時のアメリカのコンピュータで使われていたアルファベット26文字の大文字と小文字に、0~9までのアラビア数字、それにタイプライターの時代から使われていたようないくつかの記号が含まれます。また表示されない機器を制御するための制御文字というものにもコードを与えています。

ASCII

ということで、制御文字32個、図形(表示される)文字94個、そして少し中途半端な立場である空白とDELコード2個の128文字に対してコードを割り振りました。

ASCII コード

この時代はビデオ端末なんかはまだ滅多なことでは存在せず、紙テープでデータのやり取りをして、結果を出すのはラインプリンタです。ですからアンダーライン(_)などは、文字にアンダーラインを引きたければ、文字を打ってから1文字位置を戻して重ね打ちをするという使い方をしていました。バッククオート(`)やチルダ(~)、アップアロー(^)も同様で外国語などでアクセント付き文字を打つために重ね打ちをして使うことを想定していました。そしてアスタリスク(*)も脚注などで使うので、標準的なフォントでは真ん中ではなく少し上の方に小さく表示されるのが普通です。世の中がビデオ端末の時代になり、重ね打ちができなくなったのですが、コード自身は既に普及していたので、そのまま使われています。

さて制御文字ですが、紙テープや磁気テープの都合であったり、プリンタに必要だった制御にコードを与えていたのですが、その後、必要に応じていろいろな解釈がなされて使われ続けています。もう滅多なことではお目にかからないものもありますが、よく使われるものに関してはC言語などでお馴染みのエスケープ文字が割り当てられているコードもあります。

紙テープがすべての始まり

代表的な制御文字をいくつか説明してみます。

  • NUL コードは0。もともとは紙テープに穴が開いていない状態を示したもので、データが含まれていないので読み飛ばすものです。これがC言語では文字列の終りを示すコードとして使われるようになりました。エスケープ文字は’\0’。

  • ETX いわゆるCTRL-C。そもそもはテキストが始まるSTXとセットで使われるもので、プログラミング言語でのダブルクォート(”)のような意味を持っていたのですが、パソコンではSTOPの意味を与えられプログラムを中断するときのキーとして使われていました。UCSD-PASCALでは正しい意味で使われていて、エディタなどでテキスト入力を終了する時にも使われていました。CP/Mではメモリ上のキャッシュデータをディスクに書き戻すのにも使われていましたね(UNIXのsyncみたいな使い方)。

  • BEL ベルを鳴らす。CTRL-G。昔のプリンタには(タイプライターもそうでした)ベルが付いていて、注意を引きたい時にはこれを鳴らしていました。これはパソコン時代も引き継がれていて、バイナリファイルを表示したりすると、このコードが含まれているところで「ピッピ」鳴るので、文字通りうるさいコードです。エスケープ文字は’\a’。

  • BS バックスペース、後退。CTRL-H。印字位置をひとつ前の文字に戻すコードで、重ね打ちをするときに使われました。元々は最後に打った文字をキャンセルするという意味を持っていたわけではありません。エスケープ文字は’\b’。

  • HT 水平タブ、または単にタブ。CTRL-I。タイプライタ時代には各行の特定の位置(メカニカルに設定していた)まで印字位置を進めるというもので、水平と付くのは別に垂直タブがあるからです。でも垂直の方は滅多に使われません。昔は8文字ごとの位置が使われていましたが、今はソフトや端末の設定で変更できることが多いです。文字としての意味はもたずデータに含まれないので、データの区切り文字として使われることもあります(TSV:タブ区切りの値)。エスケープ文字は’\t’。

  • LF 改行、ラインフィード。CTRL-J。元々は印字位置を縦に進めるという意味で、水平な位置はそのままです。OSによっては、この文字だけでテキストデータの行の終わりを示します。エスケープ文字は’\n’。

  • FF 書式送り、フォームフィード。CTRL-L。プリンタ用紙の1ページ(60行とかに設定されていることが多い、そこにミシン目があって切り離せる)単位で印字位置を送るコードで改ページとも呼ばれます。ページプリンタが主流になったので、あまり使われていない気もします。エスケープ文字は’\f’。

  • CR 復帰、キャリッジ・リターン。CTRL-M。こちらは印字位置を一番左に戻します。行が右端までいかない場合は、CRとLFを送って次の行の左端に印字位置を移すのが普通だったのですが、CRだけで行の終わりを示すOSもあります。また両方使うこともあって、長きに渡って混乱の元となっている制御文字です。エスケープ文字は’\r’。

  • SO と SI シフトアウトとシフトイン。あまりポピュラーではないのですが、異なる文字セットを使う時に、その部分をこれらのコードで挟みます。例えば7ビットしか使えない環境で半角カナを使いたい時に、このコードを使って文字セットを切り替えている例もあります。

  • DC1 と DC3 装置制御1と3。XONおよびXOFFと表現されることもあり、CTRL-QとCTRL-Sのコードにあたります。デバイスにデータを連続して送る時などに一時的に止める時に使います。端末でデータがスクロールされて見えなくならないように使うことがあります。今では使うことが殆どないPAUSEキーが、この役目を持っていました。

  • CAN 取消、キャンセル。CTRL-X。最後の行をまるごと無かったことにするのに使われることが多いのですが、具体的な意味はそれぞれです。

  • ESC エスケープ。一般的にはこのコードに続くいくつかの文字に特殊な意味を持たせて(エスケープシーケンス)文字の修飾や文字セットの切り替えなどに使われます。エスケープ文字は’\e’。

  • DEL 抹消。紙テープではすべての穴が開いているコードで、間違えた文字を消すために使います。どんな文字でもすべて穴をあければ、このコードになりますからね。今ではカーソルを戻して消すのがBS、カーソルの下を消すのがDELとして使い分けられていますが、片方しかキーがないこともあり、その差は実は微妙です。

ということで、実際にキーで打つコードに直した表も作りました。

制御文字の^はCTRLの意味。CTRLとこのキーを打てば入力できるはず

もちろんBSやESC、そしてDELなどは大抵のキーボードにはこのコードを入力する専用のキーがあります。昔のキーボードはメカニカルに処理していたり、積んでいる回路も簡素なものだったので、制御文字を打ったり(0x40を引けば制御文字になる)、大文字と小文字を切り替えたり(0x20を足せば小文字になる)といった関係が大事でした。数字キーの上にある記号も、この関係で決まっていました(今は必ずしもそうではない)。このコードの影響は結構幅広く及んでいて、文字列を並び替えるのも、このコードの大小で並ぶことが多いです。プログラムを書く人にとっては、0x30~0x39を見つけたら、0x30を引けば数値になるなんていうプログラムを書いてしまうことも(本当は良くない)シバシバです。

文字集合 ● ASCII ● ISO646

ということで、アリ物のコード表を探したのですが、そもそも表に著作権があるかも怪しいのですが、自由に使えることを明言しているものが見つかりません。仕方がないのでスプレッドシートを開いて、手で打ち込んで作りました。このファイルはどう使われても結構です。そのまま使うのも加工して使っていただくのもご自由に。

ヘッダ画像は、いらすとや より
https://www.irasutoya.com/2013/04/blog-post_1969.html

#文字コード #EBCDIC #ASCII #制御文字 #図形文字 #紙テープ #ラインプリンタ #タイプライタ

この記事が気に入ったらサポートをしてみませんか?