--fb-html をつけても文字が欠落する
勉強のためソースコードを確認してみました。
問題の漢字は 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 関数を呼び出す。 という風に修正すれば 解決すると思います。
なるほど、単にcp932inv_fが真の時にret=1したら他のテストがこけたので、 a8fd410540d673da4f27d4b324b8f57b40a12d40 ではencode_fallback指定時だけにしてみました。 ありがとうございました。
nkfの--fb-htmlをつけてUTF-8テキストをShift_JISに変換する場合、変換できない文字は数値文字参照にして欲しいのですが、文字が欠落してしまうことがあります。
以下の例では、「濹」の文字が欠落します。
参考までに、iconvの--unicode-substオプションは期待通りに動作します。
使用しているOSはOS X 10.10です。nkfのソースは git://git.osdn.jp/gitroot/nkf/nkf.git より取得し、Apple LLVM version 7.0.0 (clang-700.1.76)でビルドしました。