Forums: 公開討議 (Thread #32783)

CP50221 から CP932 に変換できない文字がある (2012-09-12 23:34 by tmtm #65482)

Ruby の方に http://bugs.ruby-lang.org/issues/7005 で報告したのですが、NKF の問題のようなのでこちらで。

NKF で CP50221 から CP932 に変換できない文字があります。
CP932 で 0xF040 から 0xF9FC までの文字のうち 589 文字が変換できません。
どうやら CP50221 で1バイト目が 0x80 以上で2バイト目が 0x21-0x3F の文字が変換できないようです。

% printf "\x1b\x24\x42\x7f\x21\x80\x21\x1b\x28\x42\n" | nkf --ic=CP50221 --oc=CP932 | od -tx1c
0000000 f0 40 0a
360 @ \n
0000003

7F21 は F040 に変換できていますが、8021 は F09F になるべきなのに落ちています。

v2_0_8 では変換できていたので、 git bisect で調べたところ e013ea95a47d82bd8e0edd541ef441d90232f3ff からできなくなったようです。

このコミットから見よう見まねで次のパッチを適用したら直りました(が、これでいいのかよく分かってません)。

diff --git a/nkf.c b/nkf.c
index 5209864..1fb5f79 100644
--- a/nkf.c
+++ b/nkf.c
@@ -5491,7 +5491,7 @@ kanji_convert(FILE *f)
code_status(c1);
if (c2) {
/* second byte */
- if (c2 > DEL) {
+ if (c2 > ((input_encoding && nkf_enc_cp5022x_p(input_encoding)) ? 0x92 : DEL)) {
/* in case of 8th bit is on */
if (!estab_f&&!mime_decode_mode) {
/* in case of not established yet */

Reply to #65482×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: CP50221 から CP932 に変換できない文字がある (2012-09-13 19:42 by naruse #65487)

ありがとうございます、それでよいと思います。
50a383c848f1c8c4e107ed68c3e839ff95f275a6 で取り込みました。
Reply to #65482

Reply to #65487×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login