見出し画像

シフトJISって何が凄いの?

さて初期のパソコンで日本語を扱うときは、それぞれ独自の方法ではあったものの、正しいJISのエスケープシーケンスではなく、漢字コードの始まりと終わりを制御コードを挟むことで日本語文字であることを示し、基本的にはJISコードに準じたコードを使っていました。このように英数字と日本語というモードを切り替える方法は、ある意味わかりやすく1バイトしか無い英数字を扱うプログラムに対して、切り替えコードを見つけたら日本語独自の処理を行うコードを追加すれば済むとも言えます。この方法は、通信で送受信したりファイルに格納しておく分にはさほど困ることがないのですが、文字列を表示したり編集する際にはなかなか面倒なことが起きます。

Shift_JIS

まず処理としてはモードが存在するので、文字の挿入削除の際に余分なモード切替が残らないように正規化する必要があります。処理の都度、正規化を行わないと何らかの理由で元のデータが正規化されていないことも想定しなければなりません。いずれにせよ文字数とバイト数が一致しないので、常にその違いを意識する必要があります。

それから、これはある意味、タマタマではあるのですが、日本語を表示する時に画面上は英数字2文字分の幅を持つという使い方が一般的となり、通常の日本語文字が全角なので、英数字は半角だよという表現が使われるようになりました。日本語コードが2バイトで英数字が1バイトなので、モード切替コードを除けば表示上の幅とメモリ上のサイズが一致することになりました。

また日本語を含む文字データを、日本語に対応していないシステムで扱った場合、モードを扱えないので制御文字で囲まれた英数字が並ぶこととなり、ここで文字列を編集すると本来の文字がわからないだけではなく、モード切替コードが正しく正規化されないので、もう正しい日本語文字列で無くなってしまうことも発生します。

さて漢字というか2バイト文字以前の日本で一般的に使われていたのは最上位ビットが0の128文字に関しては殆どASCIIと(\が¥になっていますが)同じで、最上位ビットが1の128文字に関してはカタカナを入れたコードを使っていました。さらに、もともと未定義とされていた部分に簡易グラフィックでも使われる図形文字であるとか、ひらがななどを追加されていることもありましたが、これらの互換性は殆どありませんでした。

とほほの文字コード入門

とにかくモード切替がいけないのです。これさえ無ければ表示上のサイズとメモリ上のサイズが一致します。そこで日本独自の最上位ビットが1の範囲で未定義となっている 0x81~0x9fと0xe0~0xefで始まれば(要はカタカナ以外の部分)、そこは2バイト文字として扱い、続くバイトはシフトJISに対応していないシステムで困らないように制御文字の範囲を除いた0x40~0x7eと0x80~0xfcを組み合わせて(0x7fは制御文字です)、都合8836種類のコードが割り当てられるようにしたのがシフトJISと呼ばれるコードです。

文字コード表 シフトJIS(Shift_JIS)

シフトJISが考えられた時の日本語コードの範囲は用意された区点コード94✕94のうち第1水準と第2水準、非漢字を合わせた6800字あまりが定義されており、残りは未定義だったので8836種類あれば十分でした。この範囲であれば未定義コードに対しても1対1の変換が出来るようになっています。JIS区点コードからシフトJISコードへの変換は計算式で済みますし、一番素晴らしいのは対応していないシステムに対しても8ビット目さえちゃんと使えれば、表示上は謎の文字になるとはいえ、処理としては何も困らない「はず!」ということでした。そして余分な制御文字を必要としないので表示のサイズととメモリ上のサイズが一致するようになったことです。

このコードがいわゆるDOSと言われるCP/MやMS-DOSで採用されたこともあり、瞬く間に普及し日本語コードと言えばシフトJISであるという状況になりました。日本語に対応していないアプリケーションであっても、少しばかり(漢字を削除するときにはちゃんと2文字分削除するなど)注意すれば、そのまま使えてしまうことも出来ました。まあ細かな問題はそれこそいくらでもあったのですが、これで一気に日本語が使える環境が普及したわけです。

さてシフトJISは国際的に認められたコードではありませんでしたし、英語と日本語以外の文字コードに対する配慮もありません。また制御文字のコード範囲を除けたものの、図形文字に関しては特別な配慮をしていないので、エスケープ文字として良く使われていた(\または¥)の文字コードを含む文字列で多くの問題を引き起こしました。その辺りで苦労された人は数知れませんが、その話は次の機会にでも。

ヘッダ画像は、以下のものを使わせていただきました。https://www.irasutoya.com/2013/11/blog-post_81.html

#文字コード #シフトJIS #SJIS #日本語文字コード #2バイト文字

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