とある事情でうちの職場の人がドイツ語でコメントが入ったソースコードを解読することになったという。
ドイツの会社で昔に設計されたシステムに組み込まれたマイコンのプログラムだそう。
よくこんなの入手したなぁと思うんだけど。
ドイツ語の多くはASCIIの範囲で表せるが、ウムラウト付きの文字とエスツェットは含まれない。
それで文字コードの選択で「中央ヨーロッパ言語」とか選ぶんだけど、
それでもどうにもおかしいのでバイナリエディタで細かいところを見る。
すると”ü”が0x81というデータで表されているように見える。
一体どんな文字コードなんだろう? 少なくともISO 8859シリーズではないことは確かである。
それでWikipediaのヨーロッパ言語の文字コード一覧をめくっていると、コードページ437であることが判明した。
相当古い文字コードなんですよね。
ASCIIの図形文字(0x20~0x7E)とは互換性があるが、それ以外の部分には独自の文字がぎっしり定義されている。
ASCIIの外側に定義された文字にはドイツ語などの表記に必要な文字もあるが、
罫線がかなり多くて画面に表を表示することを意図したんだろうかとか、
それ以外にも記号類に割いている部分が多いのが特色である。
ドイツ語の表記ならばCP437の範囲で問題ないのだが、
ヨーロッパ言語を表記するという点では物足りないものではあったようで、
もしかすると罫線や記号を削ってアルファベットに置き換えたCP850だったのかもしれない。
いずれにせよ、これらが標準規格にならなかった文字コードである。
デファクトスタンダードってやつですね。
ヨーロッパ言語を表記する文字コードで規格化されたのがISO 8859シリーズである。
これは0x00~0x7FはASCIIと互換性があり、0x80~0x9Fに制御文字の拡張、0xA0~0xFFに図形文字の拡張を行ったものである。
図形文字の拡張は使用を想定する言語ごとに様々設けられている。
もっともよく知られているのがLatin-1こと ISO 8859-1 である。
ドイツ語の表記もかつてはこれが一般的という認識だった。
日本のJIS X 0201もISO 8859と同じような考え方で作られている。
JIS X 0201は1バイトでASCII相当の文字と日本語のカタカナを表現するもの。
カタカナや日本語の記号を0xA0~0xDFの範囲に並べている。
Shift_JISはJIS X 0201との互換性を意図して作られたもので、
いわゆる半角カナとして1バイトのカタカナを表記することができる。
JIS X 0201自体は今となっては古い規格だが使えなくはない仕組みである。
一方のCP437だが、少なくとも手元のエディタでは対応していなかった。
調べてみるとPythonでCP437をエンコーディングに指定できるようで、
with open('in.txt',encoding='cp437') as srcfile:
textdata=srcfile.read() with open('out.txt','w',encoding='utf-8') as dstfile:
dstfile.write(textdata)
という、ただテキストデータを右から左に書き直すだけのプログラムを書けば、
多くのエディタが対応しているUTF-8に変換できる。
これでドイツ語として読めるデータになった。
それにしてもなんでCP437あるいはCP850だったんだろうね。
コンピュータ内部で閉じる問題だったからASCIIの外側は何でもよかったのだろうが。
ただ、インターネットでのデータ交換ということで言えば、
Unicodeが普及する以前はISO 8859シリーズを使うのが普通だったはず。
だからそういうのとは全く異なる環境だったんだろうな。
日本語の場合、1バイトではほとんど表現できないのは明らかだったが、
ヨーロッパ言語の場合、1バイトで表記できるという考えが当初あったのだと思う。
ただ、ヨーロッパには様々な言語があり、言語ごとに使う文字もいろいろ。
ラテン文字を使う言語で使う文字を1バイト内に収めることすら容易ではない。
おそらくこのような状況を打開するためにUnicodeが生まれたんだろうなと。
当初のUnicodeは2バイトで世界中の文字を表現しようと考えていた。
ヨーロッパ人の想像では65536字あれば足りると考えていたのだろう。
それをシンプルに表現する手段としてUTF-16という文字コードが考えられていたのだろう。
ただ、漢字圏は大変で、CJK統合漢字やハングルでいろいろ混乱を生みながら、
最終的には65536字で全て表現するのは無理というところに行き着いている。
UTF-16でU+10000以降の文字を表現するためのサロゲートペアもそれはそれで混乱の元である。
このあたりの混乱が収束するまでは各国独自の文字コードを使うことが多かったのが実情だと思う。
ヨーロッパと比べると各国独自の事情が多くて統一できないので。
今では日本語でもUnicodeが使われることは増えた印象である。
JIS X 0221で追加された文字はUnicodeでの表現を想定していることや、
絵文字がUnicodeに収録されたことなど、Unicodeを使うメリットが増してきたのではないか。
というわけでASCIIの外側をどう拡張するかというのは、
ヨーロッパではいろいろなバリエーションがあって、今回はその中でも古いタイプのものを引いたということが言える。
まさか一般的なエディタで対応していない形式を引くとは思わなかった。