スキップしてメイン コンテンツに移動

投稿

6月, 2012の投稿を表示しています

KyoroTextViewerでのISO 2022の扱いについて

KyoroTextViewerが下記機能に対応するにあたり、解決すべき問題を記録しておく。
- ISO 2022への対応
- アラビア語へり対応
※ todo アラビア語は、ここでは書かない。別に書く
[はじめに] ISO 2022は、文字集合(バイトコードに応じて表示する文字)を入れ替えて表示するため、先頭から順に読み込んでいかなくてはなりません。
※具体的には、以下のような感じで、文字集合を変更するESCが挿入されます。
「こんにちはISO_2022_JP」の場合
<ESC 日本語> こんにちは <ESC ASCII> ISO_2022_JP  KyoroTextViewerでは、ギガバイトのデータも軽快に表示できることを、目標としているため、
 毎回先頭からテキストを読み込むといったことはなるたけ避けたいと考えています。


[問題/解決]
例えば「改行無しに、数万文字が続くような場合」、毎回先頭から読み込むのと、
画面に表示するまでに時間がかかってしまいます。

そこで、毎回先頭から読み込むのではなく、前もって記録していた文字集合を渡すように
してあげることにしました。
[詳細] 具体的には、(designate) と(invoke) を記録しておく必要があります。
以降、ISO 2022について説明します。

文字集合を切り替えるのに、2つの方法を使用します。
* 文字集合を符号表(C0 GL C1 GR)に指定する(designate) 
*  文字集合をバッフア(G0,G1,G2,G3)にi指定する(invoke) する。その後符号表(C0 GL C1 GR)にわたす。
例)

1. <G0に文字集合を設定する>
2. <GLに対応する文字を変える>

[実現方法]
○ シングルシフトは記録しない。  - ロッキングシフト    命令で上書きされるまで、  - シングルシフト    1文字だけ
○*->UTF8への変換はJavaのAPIをそのまま利用する。なので、指定されている文字集合の変更だけを記録しておけばよい。
○指定されている文字集合の記録について、汎用的に作るのは断念する。 サポートしたいCharsetのdesignate/invokeを記録するようにする。 ※ ISO2022ベースかどうかの判定は…