我正在測試C#的metaphone實現並將其結果與PHP中內置的metaphone()函數進行比較。但是,我遇到了一個錯誤(它是previously documented in PHP's issue tracker並在a mailing list上討論過),但我試圖瞭解他們錯誤背後的C代碼,這是爲了我個人的興趣。PHP metaphone實現bug
基本上,根據metaphone算法,大多數-gh-的實例應該呈現爲沉默。在「萊特」的具體測試情況下,我希望(和我自己的算法生成)「RT」的變音鍵
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
然而,PHP的音位函數返回RFT。顯然,它將-gh-轉換爲F,就好像它在一個單詞的末尾(例如「粗糙」),但在「wright」這個詞的情況下,這是不正確的,因爲-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人,所以代碼對我來說一點都不清楚。
那麼也許有人可以提交一個補丁到列表中並修復這個bug! – 2012-02-13 20:45:34
SO需要更多這樣的問題:) – 2012-02-13 21:57:59