Ticket #30162

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

오픈 날짜: 2012-11-20 19:08 마지막 업데이트: 2012-11-22 16:22

Reporter:
소유자:
(None)
Type:
Status:
Closed
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None
File:
1

Details

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
 

Ticket History (3/4 Histories)

2012-11-20 19:08 Updated by: deton
  • New Ticket "JIS X 0201のESC(Iエンコードの「ス」が「=」になる" created
2012-11-22 16:22 Updated by: naruse
  • Status Update from Open to Closed
  • Ticket Close date is changed to 2012-11-22 16:22
댓글 올리기

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

2013-01-17 23:06 Updated by: 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 }}}

Attachment File List

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login