出力のエスケープシーケンス

ISO-2022-JPの出力を眺めていて、変なところを見つけた。ここから今日の泥沼が始まった。

改行の前にエスケープシーケンスでJIS X 0201左側にしてあるのに、更にその後、不明文字の?を出すのにJIS X 0201左側に変更するエスケープシーケンスが発行されている。
つまり、明らかに無駄なエスケープシーケンスが存在する。
事情は定かでなかったが、この直前でG0に違うCCSがdesignateされていることは自明だった。


よくよく突き詰めていくと、いわゆる連結文字、たとえば「か゜」を処理するときに、発生していることが分かった。

JIS X 0213未対応の符号系ではエラーとなるが、連結用の半濁点などは「後付け」なので、実は処理が結構複雑なのだ。

まず、「か」を受信した時点でリングバッファに吐き出され、同時にJIS X 0208に変更するエスケープシーケンスが発行されているわけだ。同時に、内部管理IDもそのように書き換える。

次に、連結用半濁点を受信したら、リングバッファから前の文字をキャンセルする。
さてこの時、キャンセルされた中にエスケープシーケンスが混じっているわけです。
つまり、エスケープシーケンスをキャンセルしたら、内部管理状態も「前の状態」に戻さないといけない。
これがなかったから、無駄なエスケープシーケンスが発行されていたわけです。
そんなわけで、当初は入力だけを想定していた符号履歴処理を、出力にも追加したのである。このために、またAPI関数の引数が一つ増えた。


ちなみに実際にキャンセルするのはアプリ側の仕事であり、DLLはフラグで要求をアプリに返すわけです。
実際にキャンセルしたら、その内容をバッファに入れてフラグを立て、次回DLL呼ぶときに渡します。
DLLは、アレゲなものと認識したら、履歴処理を走らせます。

まぁ、最初から想定していないが、他人が使うのは殆ど不可能に近いDLLでしょうなぁ。
アプリ側の仕事が普通に重すぎますね。仕方がないのですが。


ちなみに、入力のエスケープシーケンスは原則として制御コード処理DLLで処理され、ここで履歴管理されますが、出力は各DLL固有です。今は、日本語処理DLLで単独処理しています。
いずれ、ラテン系言語処理を追加するとき、ISO-8859-* 関係で同様の処理を作ることになるのだと思われます。

2008/12/01(月)15:03 |Comments(0) |Trackback(0)

製造開発 | プログラミング | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

C++なのに、Cに毛が生えただけの「C~」を書いてないか? ホーム ユーザー定義外字の入出力
トラックバック

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

カレンダー

07 | 2017/08 | 09
- - 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