NKF の濁点と半濁点の処理のバグ2007年09月19日 21時41分42秒

NKF 1.71 では問題ありませんが、NKF 2.X では、濁点、半濁点の処理にバグが あるようです。


 echo "スまホみ" | nkf -Ee
 ズポ

となります。(ス、ホはいずれも半角カナ)
これは、半角カナは濁点、半濁点も1文字であり、全角カナに変換する際に2文字を1文字の濁点あるいは半濁点付きの文字に変換しないといけないのですが、この判定を誤っています。
全角の「ま」や「マ」の下位ビットが半角カナの濁点の下位ビットと同じ、 全角の「み」や「ミ」の下位ビットが半角カナの半濁点の下位ビットと同じためです。

これを修正するパッチを添付します。 なお、ソースの3箇所の改行コードがおかしいので、これも修正しています。


--- nkf.c.org   2007-07-25 00:13:03.000000000 +0900
+++ nkf.c       2007-09-19 21:36:35.000000000 +0900
@@ -2755,13 +2755,13 @@
                     /* normal ASCII code */
                     SEND;
                 }
-            } else if (c1 == SI && (!is_8bit || mime_decode_mode)) {^M
+            } else if (c1 == SI && (!is_8bit || mime_decode_mode)) {
                 shift_mode = FALSE;
                 NEXT;
-            } else if (c1 == SO && (!is_8bit || mime_decode_mode)) {^M
+            } else if (c1 == SO && (!is_8bit || mime_decode_mode)) {
                 shift_mode = TRUE;
                 NEXT;
-            } else if (c1 == ESC && (!is_8bit || mime_decode_mode)) {^M
+            } else if (c1 == ESC && (!is_8bit || mime_decode_mode)) {
                 if ((c1 = (*i_getc)(f)) == EOF) {
                     /*  (*oconv)(0, ESC); don't send bogus code */
                     LAST;
@@ -4584,11 +4584,11 @@
        return;
     }
     if (x0201_f && z_prev2==X0201) {  /* X0201 */
-        if (c1==(0xde&0x7f)) { /* ^[$BByE@^[(B */
+        if (c1==(0xde&0x7f) && c2 == X0201) { /* ^[$BByE@^[(B */
             z_prev2=0;
             (*o_zconv)(dv[(z_prev1-SPACE)*2],dv[(z_prev1-SPACE)*2+1]);
             return;
-        } else if (c1==(0xdf&0x7f)&&ev[(z_prev1-SPACE)*2]) {  /* ^[$BH>ByE@^[(B
 */
+        } else if (c1==(0xdf&0x7f)&&ev[(z_prev1-SPACE)*2] && c2 == X0201) {  /*
 ^[$BH>ByE@^[(B */
             z_prev2=0;
             (*o_zconv)(ev[(z_prev1-SPACE)*2],ev[(z_prev1-SPACE)*2+1]);
             return;

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

※トラックバックの受付件数を超えているため、この記事にトラックバックを投稿することができません。