[Nkf-dev 40] Re: C0 control

Back to archive index

NARUSE, Yui narus****@airem*****
2006年 8月 23日 (水) 13:28:47 JST


成瀬です。

Hiro Yoshioka wrote:
> nkf207を利用中です。nkfで例えば
> nkf --ic=eucjp-ms --oc=utf-8
> みたいな変換をすると0x1bがおとされる場合がある
> みたいなんですがこれは仕様でしょうか?

仕様・・・だと思っていたのですが、
実装を見直してみたら整合性が取れていないのでバグとして直します。

原因としては、nkf で EUC 入力は、処理を JIS 入力と兼用しており、
JIS 入力の時でも EUC の入力を取れますし、その逆も可能です。
つまり、入力に関して JIS も EUC も ISO 2022 系として扱っています。
そのため、EUC 入力でも SI, SO, ESC は制御文字として扱い、捨てられます。

というのが現在の実装の趣旨でした。

> ソースをながめてみたんですが、どこがどう悪いのか
> 全然見当がつきませんでした。

位置としては nkf.c の 2576行目から2582行目までですね。

                }
            } else if (!is_8bit && c1 == SI) {
                shift_mode = FALSE;
                NEXT;
            } else if (!is_8bit && c1 == SO) {
                shift_mode = TRUE;
                NEXT;
            } else if (!is_8bit && c1 == ESC ) {
                if ((c1 = (*i_getc)(f)) == EOF) {

ちなみに、この is_8bit は、2419行目と、

    if(input_f == SJIS_INPUT
#ifdef UTF8_INPUT_ENABLE
       || input_f == UTF8_INPUT || input_f == UTF16BE_INPUT || input_f
== UTF16LE_INPUT
#endif
      ){
	is_8bit = TRUE;
    }

と、2485行目で変えているので、

	    } else if (c1 > DEL) {
                /* 8 bit code */
                if (!estab_f && !iso8859_f) {
                    /* not established yet */
		    if (!is_8bit) is_8bit = TRUE;

input_f == EUC_INPUT を加えればいいはず・・・ですが、
EUC_INPUT は存在せず、JIS_INPUT と兼用なのですよね。

もっとも、ISO 2022 系だからという話と、2485行目が矛盾しているので、
input_f == EUC_INPUT 相当の追加と、2485 行目の削除を行う予定です。

この場合、JIS 入力では EUC の入力を読めますが、
EUC 入力では JIS 入力は素通しすることになるでしょう。


悩みどころはどうやって相当の処理をするかですが、
今は捨ててしまっている --ic の情報を保持するようにしようかな。

-- 
NARUSE, Yui  <narus****@airem*****>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA



nkf-dev メーリングリストの案内
Back to archive index