Namazu-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

鯰(なまず)が蚓(みみず)に化ける



竹迫です。

namazu.cgi の検索結果の書式ファイル NMZ.result.*.ja において
記述された日本語が文字化けしてしまうという現象がありましたので、
ご報告いたします。

■ version:
namazu-2.0.5-pre1 で確認

■ 不具合の現象:
namazu.cgi のリソースファイルにおいて Lang ja_JP.SJIS として、
検索結果の出力を Shift_JIS 漢字コードに設定していると
    NMZ.result.normal.ja
    NMZ.result.short.ja
に書かれている日本語が文字化けすることがある。

■ 簡単な再現方法:
namazurc もしくは .namazurc のファイルにおいて Lang ja_JP.SJIS と
書いた行を追加し、検索結果の出力漢字コードを Shift_JIS に設定する。
NMZ.result.normal.ja を以下のように編集し、EUC-JP で保存する。

---- ここから ----
<dt>${namazu::counter}. <strong><a href="${uri}">${title}</a></strong>
<dd><strong>著者</strong>: <em>${author}</em>
<dd><strong>日付</strong>: <em>${date}</em>
<dd>${summary}
<dd><a href="${uri}">${uri}</a> (${size} bytes) 鯰<br><br>
---- ここまで ----

# NMZ.result.normal.ja に“鯰”という文字を追加しています。

このようにして namazu.cgi を実行すると、検索結果の中の
鯰(なまず)の文字が、蚓(みみず)に文字化けしてしまう。

■ 不具合の原因:
output.c の print_hlist() 中で load_nmz_result() を呼び出して
検索結果の書式 NMZ.result.*.ja をファイルから読み込むときに、
nmz_codeconv_external() によって EUC-JP から出力系の漢字コード
である Shift_JIS に変換され template_caches[idxid] に格納される。
ここで、Shift_JIS に変換された template_caches[idxid] を元に
result.c の compose_result() によって検索結果を生成し、その後
nmz_codeconv_external() を呼び出して EUC-JP から Shift_JIS に
漢字コードを変換し出力しているので、結果的に NMZ.result.*.ja 
のファイルに対して2回ほど euctosjis() による漢字コードの変換を
行ってしまうので、文字化けの原因となる。

ちなみに、鯰と蚓のそれぞれの漢字コードは、
  鯰(なまず):(JIS -> 7250, EUC-JP -> F2D0, Shift_JIS -> E9CE)
  蚓(みみず):(JIS -> 694E, EUC-JP -> E9CE, Shift_JIS -> E56D)
に割り当てられており、EUC-JP → Shift_JIS への変換が2回行われる
ことによって、鯰(EUC-JP)が F2D0 → E9CE → E56D と変換され、
蚓(Shift_JIS)に文字化けしてしまう。

■ 対策:
output.c の load_nmz_result() において、余分な漢字変換を行わない
ようにするパッチ(添付のoutput.c.patch)を作ってみました。
※注)namazu-2.0.5-pre1 用のパッチです。

NMZ.result.*.ja は EUC-JP で書かれているという前提ですが、
とりあえず私のところではうまく動いているようです。

--
   広島市立大学 情報科学部 情報機械システム工学科
     竹迫 良範 <takesako@xxxxxxxxx>

Attachment: output.c.patch
Description: Binary data