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

[debian-users:42759] Re: [gettext] ja.po の msgid に non-ASCII 文字は使える?



濱崎です。

[debian-users:42596] で質問した、
「UTF-8 で書いた ja.po の中で、 msgid に non-ASCII 文字は使用できるのか」
という問題について、
条件付きで使えることがわかりました。

試しかた:

    添付の g.c の中の文字列を変換するため、
    添付した ja.po を使用してメッセージカタログを作ります。
    このとき、
     msgfmt -o g.mo ja.po
    で生成した g.mo では変換に失敗し、

     msgfmt --no-hash -o g.mo ja.po
    で生成した g.mo では変換に成功しました。


このときの locale(1) の出力結果は

    LANG=ja_JP.eucJP
    LC_CTYPE="ja_JP.eucJP"
    LC_NUMERIC="ja_JP.eucJP"
    LC_TIME="ja_JP.eucJP"
    LC_COLLATE="ja_JP.eucJP"
    LC_MONETARY="ja_JP.eucJP"
    LC_MESSAGES="ja_JP.eucJP"
    LC_PAPER="ja_JP.eucJP"
    LC_NAME="ja_JP.eucJP"
    LC_ADDRESS="ja_JP.eucJP"
    LC_TELEPHONE="ja_JP.eucJP"
    LC_MEASUREMENT="ja_JP.eucJP"
    LC_IDENTIFICATION="ja_JP.eucJP"
    LC_ALL=ja_JP.eucJP

で、 LANGUAGE は設定されていません。

最終的に、どこがまずいのかはしぼり切れていないのですが、
わかったところまで報告します。

やったこと:

    ddd デバッガで dcigettext() の動作を追いました。
    libc6-dbg パッケージをインストールし、

    export LD_LIBRARY_PATH=/usr/lib/debug

    として、デバッグバージョンの libc.so が使われるようにしました。
    glibc 2.3.2.ds1-20 のソースを Debian アーカイブから
    持ってきて展開し、このソースファイルを使用して、

    ----------- glibc-2.3.2.ds1/build-tree/glibc-2.3.2/intl/dcigettext.c
    704:      nls_uint32 nstr =
    705:        W (domain->must_swap_hash_tab, domain->hash_tab[idx]);
    706:
    707:      if (nstr == 0)
    708:        /* Hash table entry is empty.  */
    709:        return NULL;
    ----------- glibc-2.3.2.ds1/build-tree/glibc-2.3.2/intl/dcigettext.c


    non-ASCII を含む msgid を変換する時には、
    intl/dcigettext.c: 705 行め付近の、nctr の計算結果が 0 になり、
    707 行目の判定で該当する msgid なしということにされてしまいます。

    705 行目の W の実体は、
    gettextP.h に定義されているマクロで、
    第一引数が 0 でないときには第二引数のバイトスワップをして返すようです。
    引数は問題発生時、いずれも 0 になっています。

    domain->hash_tab[idx] が 0 になるのは、ハッシュの計算に
    ミスがあるためではないかと思い、msgfmt の man を見直して 
    --no-hash オプションを見つけました。これを試したら
    うまくいったというわけです。

添付した単純な例だけでなく、この問題を提起するきっかけとなった
bluefish でも --no-hash を付けることで動作することを確認しました。

動くことは動くんです。ただ、msgfmt の info には、
ハッシュテーブルがないと、検索に余計なコストがかかることが
示唆されています。

`--no-hash'
     Don't include a hash table in the binary file.  Lookup will be
     more expensive at run time (binary search instead of hash table
     lookup).


ハッシュ計算の中身とか、生成される .mo のフォーマットとか
まだ理解できていないので、私一人で追い続けるとすると、
もっと時間がかかりそうです。
この段階で GlibC の開発元に一度投げた方がいいでしょうか?

また、何か心当たりのある方がいらっしゃれば、
アドバイスいただけると幸いです。

--------------------------------------------------
    濱崎 健 E-mail: hma@xxxxxxxxxxxxx

Attachment: g.c
Description: Binary data

Attachment: ja.po
Description: Binary data