我正在测试 C# 的 metaphone 实现,并将其结果与 PHP 的内置 metaphone() 函数进行比较。但是,我遇到了一个错误(以前记录在 PHP 的问题跟踪器中并在邮件列表中讨论过),但出于个人兴趣,我正在尝试了解其错误背后的 C 代码。
基本上,根据变音位算法,-gh- 的大多数实例应该被渲染为静音。在“wright”的具体测试用例中,我期望(并用我自己的算法生成)“RT”的变音键
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
但是,PHP 的变音位函数返回 RFT。显然,它将 -gh- 转换为 F,就好像它位于单词的末尾(例如“rough”),但对于单词“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 函数的确切作用以及为什么这段代码错误地为“wright”中的 -gh- 呈现 F 吗?我不是真正的 C 人,所以代码对我来说根本不清楚。