Microsoft Windows Codepage : 50220 (CP50220)

始めに


(この部分は後日補足です)
外字や98文字、IBM拡張漢字を「まともに」EUC-JPで扱いたい需要には、このCP50220ではなく、eucJP-openをおすすめしています。
このCP50220は、言うなれば「ネタ」であり、実用になりません。念のため。


作業


ISO-2022-JPの、Windowsの実装を作り始めました。
目眩がしそうなほど酷い仕様なんで、どうしようかと思いましたが、何とかしました。

一応、Internet Explorerやら、Outlook Expressやらの、自称「ISO-2022-JP」の正体です。

一応こちらでは「ISO-2022-JP/WIN」という名前(CES/CCS名)で呼ぶことにしました。


仕様の概要


大まかな仕様は次の通りです。

・G0への指示で、G0だけでなくGR側(C1とG1?)も変わります (な、なんだってー!!)
・G1への指示は出来ません

もうこの時点でダメだと思うけど、まだある。

・「ESC 2/8 4/2」(ASCII)と「ESC 2/8 4/10」(JIS X 0201ローマ字)は同義です
・「ESC 2/4 4/0」(JIS C 6226)と「ESC 2/4 4/2」(JIS X 0208)は同義です
・出力は、「ESC 2/8 4/2」(ASCII)または「ESC 2/4 4/2」(JIS X 0208)を使用します
・JIS X 0208として指示される文字集合には、Windows独自の文字が入っています
・初期状態で、G1にJIS X 0201片仮名相当が指示されています
・しかし、実はJIS X 0201片仮名ではなくシフトJISです (え?)
・2バイト文字の1バイト目は0x21~0x7e【ではありません】 0x21~0x97です(ちょ、おま)

なんか凄く嫌になってきたでしょう。



異常すぎる


結局、ANKモードか、漢字モードか、という、古くさいモード切替にしか、エスケープシーケンスを使っていないわけです。
だからG0とかG1とか無関係に、G0への指示だけでGR側(C1とG1?)まで変わってしまったりするわけです。
バッファとかいう概念はなく、あくまでエスケープシーケンスはモード切替の目印に過ぎない。


そして、ANKモードは、実はシフトJISなんですよ。本当に。
ANKモードにおいて、0x80~0xffはシフトJISの1バイト目なんです。

前に、WindowsのEUC-JP、CP51932についての説明を書きましたけど、この自称ISO-2022-JPの内部では同様にシフトJISへ変換し、Unicodeとの変換表を操作しているものと推定されます。


更に驚愕なのが、漢字モードでしょう。
ESC 2/4 4/2などで指示した後は、驚異の世界です。0x21~0x7eなんて常識はありません。

1バイト目0x7f~0x92(95区~114区)、2バイト目0x21~0x7eの計20区は、ユーザー定義外字領域になっています。
更に、0x93~0x97(115区~120区)、2バイト目0x21~0x7eにはIBM拡張漢字があります。
0x98を超えると、何やら妙な処理になるようです。

0x7fとか、C1まで文字であるとか、素敵な世界が広がっております。

ここまで、G1の後に?を付けていましたが、G1は実際には使っていない気がするので。



実装


だいたい、G0への指示でC1やG1?まで変わるなんて常識的に考えて有り得ない想定はしていないのだから、この辺の関数や、エスケープシーケンス処理部分の仕様変更をせざるをえなかった。

あとそもそも、G0やC1、G1にある文字集合に、どんなIDを振って管理するかも考えてしまった。


結論として、符号はISO-2022-JPとは違うCES-IDを振り、ANK-GL、ANK-GR、KANJI-GL、KANJI-GRという四種類のCCS-IDを作って番号を振っておいた。

ASCII等の指示があれば、G0にANK-GL、C1/G1にANK-GRを指示する。実はシフトJIS。
JIS X 0201片仮名の指示があれば、G0にANK-GR、C1/G1にもANK-GRを指示する。左でもシフトJIS。
JIS X 0208等の指示があれば、G0にKANJI-GL、C1/G1にKANJI-GRを指示する。

KANJI-GRなんてあるのは、上に述べたように0x7eなんて軽々突破して、0x97なんていうGR領域にまで達してしまうからです。

一応、正常系は動作していると思います。異常な符号位置を指定したときの動作は、内部でSJISで処理しているわけではないので合わせることが難しく、今回は完全互換にはしていません。




さらなる亜種


このCP50220の他に、二種類の亜種があります。

CP50220 JIS X 0201片仮名はJIS X 0208に変換して出力する
CP50221 JIS X 0201片仮名は「ESC 2/8 4/9」を使いG0をGLから出力する
CP50222 JIS X 0201片仮名はSI/SOを使い、G1をGLから出力する

CP50221はともかく、CP50222なんてSI/SO管理とか妙な処理を追加する必要があって、かなり大変そう。
Microsoft的には楽だったのだろうか。良く分かりません。

2009/01/12(月)00:25 |Comments(0) |Trackback(0)

文字 | プログラミング | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

ISO-2022-JP-MS ホーム Unicode 1.0/1.1への対応
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

04 | 2017/05 | 06
- 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 27
28 29 30 31 - - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR