私はC#のメタフォンの実装をテストし、その結果をPHPの組み込みのmetaphone()関数と比較しています。ただし、バグ(以前はPHPの課題追跡システムに文書化されてメーリングリストで説明されていました)に遭遇しましたが、個人的な興味のために、バグの背後にあるCコードを理解しようとしています。
基本的に、メタフォンアルゴリズムによれば、-gh-のほとんどのインスタンスはサイレントにする必要があります。「ライト」の特定のテストケースでは、「RT」のメタフォンキーを期待します(そして私自身のアルゴリズムで生成します)
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
ただし、PHPのメタフォン関数はRFTを返します。明らかに、それは単語の終わりにあるかのように-gh-をFに変換します(たとえば「ラフ」)が、単語「ライト」の場合、-gh-は言葉の終わりに来ないでください。PHPソースディストリビューションのmetaphone.cファイルを見ると、いくつかの重要なことがわかります。
/* 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関数が正確に何をするのか、そしてなぜこのコードが「ライト」の-gh-のFを誤ってレンダリングしているのかを理解するのを手伝ってもらえますか?私は実際にはCの人ではないので、コードは私にはまったくわかりません。