- ISO 2022への対応
- アラビア語へり対応
※ todo アラビア語は、ここでは書かない。別に書く
[はじめに]
ISO 2022は、文字集合(バイトコードに応じて表示する文字)を入れ替えて表示するため、先頭から順に読み込んでいかなくてはなりません。※具体的には、以下のような感じで、文字集合を変更するESCが挿入されます。
「こんにちはISO_2022_JP」の場合KyoroTextViewerでは、ギガバイトのデータも軽快に表示できることを、目標としているため、
<ESC 日本語> こんにちは <ESC ASCII> ISO_2022_JP
毎回先頭からテキストを読み込むといったことはなるたけ避けたいと考えています。
[問題/解決]
例えば「改行無しに、数万文字が続くような場合」、毎回先頭から読み込むのと、
画面に表示するまでに時間がかかってしまいます。
そこで、毎回先頭から読み込むのではなく、前もって記録していた文字集合を渡すように
してあげることにしました。
[詳細]
具体的には、(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ベースかどうかの判定は、自前でする必要があるため、
もともと、自分が対応しようとしたものしか対応できない。
[サポート]
ISO-2022-JP
#designate:
G0
<ESC ( B>, <ESC ( J>, <ESC $ @>, <ESC $ B>
<ESC $ ( D>, <ESC $ A>, <ESC $ ( C>
<ESC $ ( O>, <ESC $ ( P>
<ESC $ ( Q>,
G2
<ESC . A><ESC . F>
#invoke
G2
<ESC N>;single
ISO-2022-KR
#designate:
G1
<ESC $ ) C>
#invoke
G0
<SI>
G1
<SO>
ISO-2022-CN
#designate:
G1
<ESC $ ) A>,<ESC $ ) G>,<ESC $ ) E>
G2
<ESC $ * H>
G3
<ESC $ + I>,<ESC $ + J>,<ESC $ + K>,<ESC $ + L>,<ESC $ + M>
#invoke
G0
<SI>
G1
<SO>
G2
<ESC N>; single
G3
<ESC O>; single
[資料]
符号表制御文字(C0)
印字文字(GL)
制御文字(C1)
印字文字(GR)
仮想バッフア
G0 G1 G2 G3
命令
#designate
CZD : C0
C1D : C1
GZD4 : G0
G1D4 : G1
G2D4 : G2
G3D4 : G3
G1D6 : G1
G2D6 : G2
G3D6 : G3
GZDM4 : G0
G1DM4 : G1
G2DM4 : G2
G3DM4 : G3
G1DM6 : G1
#invoke
SI : GOをGLへ 7bit符号
LS0 : G0をGLへ 8bit符号
SO : G1をGLへ 7bit符号
LS1 : G1をGLへ 8bit符号
LS2 : G2をGLへ
LS3 : G3をGLへ
LS1R : G1をGRへ 8bit符号
LS2R : G2をGRへ 8bit符号
LS3R : G3をGRへ 8bit符号
SS2 : G2をGL/GRへ 1文字限り
SS3 : G3をGL/GRへ 1文字限り
ACS : アナウンス機能
G3DM4 : G3
G1DM6 : G1
G2DM6 : G2
G3DM6 : G3
G3DM6 : G3
DOCS :
IRR :
#invoke
SI : GOをGLへ 7bit符号
LS0 : G0をGLへ 8bit符号
SO : G1をGLへ 7bit符号
LS1 : G1をGLへ 8bit符号
LS2 : G2をGLへ
LS3 : G3をGLへ
LS1R : G1をGRへ 8bit符号
LS2R : G2をGRへ 8bit符号
LS3R : G3をGRへ 8bit符号
SS2 : G2をGL/GRへ 1文字限り
SS3 : G3をGL/GRへ 1文字限り
ACS : アナウンス機能
後で書き直す。
返信削除