チケット #30162

JIS X 0201のESC(Iエンコードの「ス」が「=」になる

登録: 2012-11-20 19:08 最終更新: 2012-11-22 16:22

報告者:
担当者:
(未割り当て)
チケットの種類:
状況:
完了
コンポーネント:
(未割り当て)
マイルストーン:
(未割り当て)
優先度:
5 - 中
重要度:
5 - 中
解決法:
なし
ファイル:
1

詳細

JIS X 0201がESC(Iでエンコードされている際に「ス」が含まれていると、 「=」になる現象に気付きました。 -m0を指定すると発生しません。

% printf '\x1b(I38=BG' | nkf -w
ウク=ツヌ

とりあえず、以下の変更をすれば回避できるようです。

diff --git a/nkf.c b/nkf.c
index a16b142..89c4643 100644
--- a/nkf.c
+++ b/nkf.c
@@ -5683,6 +5683,7 @@ kanji_convert(FILE *f)
 		    else if (c1 == 'I') {
 			/* JIS X 0201 Katakana */
 			set_input_mode(JIS_X_0201_1976_K);
+			shift_mode = 1;
 			SKIP;
 		    }
 		    else if (c1 == 'B' || c1 == 'J' || c1 == 'H') {
diff --git a/nkf_test.pl b/nkf_test.pl
index 79cfea6..7279cd2 100644
--- a/nkf_test.pl
+++ b/nkf_test.pl
@@ -527,6 +527,17 @@ printf "%-40s", "X0201 output: EUC";
     &test("$nkf -xe",$example{'x0201.jis'},$example{'x0201.euc'});
 printf "%-40s", "X0201 output: UTF8";
     &test("$nkf -xw",$example{'x0201.jis'},$example{'x0201.utf'});
+# test_data/x0201jis=
+
+$example{'test_data/x0201jis=.ans'} = unpack('u',<<'eofeof');
+MH:*CI*6FIZBIJJNLK:ZOL+&RL[2UMK>XN;J[O+V^O\#!PL/$Q<;'R,G*R\S-
+2SL_0T=+3U-76U]C9VMO<W=[?
+eofeof
+
+printf "%-40s",  "X0201 JIS contains '='";
+    &test("$nkf -xs",
+    "\x1b(I!\"#\$%&'()*+,-./0123456789:;<=>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\x1b(B",
+    $example{'test_data/x0201jis=.ans'});
 
 # MIME decode
 

チケットの履歴 (4 件中 3 件表示)

2012-11-20 19:08 更新者: deton
  • 新しいチケット "JIS X 0201のESC(Iエンコードの「ス」が「=」になる" が作成されました
2012-11-22 16:22 更新者: naruse
  • 状況オープン から 完了 に更新されました
  • チケット完了時刻2012-11-22 16:22 に更新されました
コメント

d844277c5702758dcd8ef9603a2db5fd4996885c にてマージしました。報告・パッチ制作ありがとうございます。

2013-01-17 23:06 更新者: None
コメント

Reply To deton

JIS X 0201がESC(Iでエンコードされている際に「ス」が含まれていると、 「=」になる現象に気付きました。 -m0を指定すると発生しません。 {{{ % printf '\x1b(I38=BG' | nkf -w ウク=ツヌ }}} とりあえず、以下の変更をすれば回避できるようです。 {{{ diff --git a/nkf.c b/nkf.c index a16b142..89c4643 100644 --- a/nkf.c +++ b/nkf.c @@ -5683,6 +5683,7 @@ kanji_convert(FILE *f) else if (c1 == 'I') { /* JIS X 0201 Katakana */ set_input_mode(JIS_X_0201_1976_K); + shift_mode = 1; SKIP; } else if (c1 == 'B' || c1 == 'J' || c1 == 'H') { diff --git a/nkf_test.pl b/nkf_test.pl index 79cfea6..7279cd2 100644 --- a/nkf_test.pl +++ b/nkf_test.pl @@ -527,6 +527,17 @@ printf "%-40s", "X0201 output: EUC"; &test("$nkf -xe",$example{'x0201.jis'},$example{'x0201.euc'}); printf "%-40s", "X0201 output: UTF8"; &test("$nkf -xw",$example{'x0201.jis'},$example{'x0201.utf'}); +# test_data/x0201jis= + +$example{'test_data/x0201jis=.ans'} = unpack('u',<<'eofeof'); +MH:*CI*6FIZBIJJNLK:ZOL+&RL[2UMK>XN;J[O+VO\#!PL/$Q<;'R,G*R\S- +2SL_0T=+3U-76U]C9VMO<W=[? +eofeof + +printf "%-40s", "X0201 JIS contains '='"; + &test("$nkf -xs", + "\x1b(I!\"#\$%&'()*+,-./0123456789:;<=>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]_\x1b(B", + $example{'test_data/x0201jis=.ans'}); # MIME decode }}}

添付ファイルリスト

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする