チケット #36572

登録: 2016-08-22 01:49

最終更新: 2017-01-24 13:45

--fb-html をつけても文字が欠落する

報告者:takahashim担当者:(未割り当て)
優先度:5 - 中マイルストーン:(未割り当て)
チケットの種類:バグ重要度:5 - 中
コンポーネント:(未割り当て)状況:完了
解決法修正済み

チケットの詳細

nkfの--fb-htmlをつけてUTF-8テキストをShift_JISに変換する場合、変換できない文字は数値文字参照にして欲しいのですが、文字が欠落してしまうことがあります。

以下の例では、「濹」の文字が欠落します。

$ ./nkf -v
Network Kanji Filter Version 2.1.4 (2015-12-12) 
Copyright (C) 1987, FUJITSU LTD. (I.Ichikawa).
Copyright (C) 1996-2015, The nkf Project.
$ cat test.txt
揷話
濹上
$ ./nkf -Ws --fb-html test.txt|nkf -Sw
揷話
上
$ ./nkf -Ws --fb-html test.txt|od -c -t x1
0000000    &   #   2   5   5   9   1   ; 230   b  \n 217 343  \n        
           26  23  32  35  35  39  31  3b  98  62  0a  8f  e3  0a        
0000016

参考までに、iconvの--unicode-substオプションは期待通りに動作します。

$ iconv -f utf-8 -t shift_jis --unicode-subst="&#%u;" test.txt|nkf -Sw
揷話
濹上

使用しているOSはOS X 10.10です。nkfのソースは git://git.osdn.jp/gitroot/nkf/nkf.git より取得し、Apple LLVM version 7.0.0 (clang-700.1.76)でビルドしました。

添付ファイル

添付ファイルリスト添付ファイルはありません
新規添付ファイル追加
添付ファイルの追加添付ファイルの追加にはログインが必要です

チケットの履歴 - 3 件中 3 件表示

2016-08-22 01:49 更新者: takahashim

  • 新しいチケット "--fb-html をつけても文字が欠落する" が作成されました

2017-01-23 13:28 更新者: snb40913

コメント

勉強のためソースコードを確認してみました。

問題の漢字は JIS 第3水準の漢字でした。 JIS第3水準の漢字を SJIS コード変換する時に ちゃんと動作していないようです。 起動パラメータに --no-cp932 というオプションを追加すれば 現象が、回避できることは確認しました。 ただし、 SJIS の外字領域に定義されている コードの扱いが変わってしまうようですが・・。

直接の原因は、おそらく プログラムのバグでしょう。 unicode_to_jis_common 関数の中で 「NEC選定IBM拡張漢字」の逆変換フラグ が無い場合に *p1, *p2 に 結果を返さないのが、間違っているように見えます。

unicode_to_jis_common 関数の中で

#ifdef SHIFTJIS_CP932
    if (!ret && !cp932inv_f && is_eucg3(*p2)) {
	nkf_char s2, s1;
	if (e2s_conv(*p2, *p1, &s2, &s1) == 0) {
	    s2e_conv(s2, s1, p2, p1);
	}else{
	    ret = 1;
	}
    }
#endif
となっていますが、3バイトEUCの判定を先に行い 次に cp932inv_f フラグがあれば e2s_conv s2e_conv 関数を呼び出す。 という風に修正すれば 解決すると思います。

2017-01-24 13:45 更新者: naruse

  • チケット完了時刻2017-01-24 13:45 に更新されました
  • 状況オープン から 完了 に更新されました
  • 解決法なし から 修正済み に更新されました

コメント

なるほど、単にcp932inv_fが真の時にret=1したら他のテストがこけたので、 a8fd410540d673da4f27d4b324b8f57b40a12d40 ではencode_fallback指定時だけにしてみました。 ありがとうございました。


追記/更新 #36572 (--fb-html をつけても文字が欠落する)

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