私はC#用のメタフォン実装をテストしており、その結果をPHPの組み込みmetaphone()関数と比較しています。しかし、私はバグ(previously documented in PHP's issue trackerでa mailing listで議論されています)に出くわしましたが、私自身の個人的な興味のためにバグの背後にあるCコードを理解しようとしています。PHPメタフォン実装のバグ
基本的に、メタホンアルゴリズムによれば、-gh-のほとんどのインスタンスはサイレントにする必要があります。 「RT」のmetaphoneのキー「ライト」の具体的なテストケースでは、私が期待して(と私自身のアルゴリズムで生成)
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
しかし、PHPのmetaphoneの機能は、RFTを返します。明らかに、単語の終わりにあるかのように、-gh-をFに変換しますが、単語 "wright"の場合、-gh-が実行するので、これは正しくありません。言葉の最後に来ない。
/* These prevent GH from becoming F */
#define NOGHTOF(c) (ENCODE(c) & 16) /* BDH */
...
/* Go N letters back. */
#define Look_Back_Letter(n) (w_idx >= n ? toupper(word[w_idx-n]) : '\0')
そして、ライン342上:
case 'G':
if (Next_Letter == 'H') {
if (!(NOGHTOF(Look_Back_Letter(3)) || Look_Back_Letter(4) == 'H')) {
Phonize('F');
skip_letter++;
誰かが私にはまさにNOGHTOF機能を理解するのに役立ちますPHPのソース配布中metaphone.cファイルを見て、私はいくつかの重要な物事を見ますなぜこのコードが-gh- in "wright"のためにFを間違ってレンダリングしているのですか?私は本当にCの男ではないので、コードは私にはっきりと分かりません。
おそらく誰かがリストにパッチを提出し、このバグを修正することができます! –
このように多くの質問が必要です。 –