Я тестирую реализацию метафона для C # и сравниваю ее результаты со встроенной функцией metaphone () из PHP. Однако я обнаружил ошибку (которая ранее была описана в системе отслеживания проблем PHP и обсуждалась в списке рассылки ), но я пытаюсь понять код C, лежащий в основе их ошибка в моих личных интересах.
По сути, в соответствии с алгоритмом метафона, большинство экземпляров -gh- должны быть отключены. В конкретном тестовом примере «wright» я ожидаю (и генерирую с помощью моего собственного алгоритма) ключ метафона «RT»
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
Однако функция метафона PHP возвращает RFT. Ясно, что он преобразует -gh- в F, как если бы он был в конце слова (например, «грубый»), но в случае слова «wright» это неверно, потому что -gh- делает не ставить в конце слова. Глядя на файл metaphone.c в исходном коде PHP, я вижу несколько ключевых моментов:
/* 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 и почему этот код неправильно отображает F для -gh- в "райт"? Я не особо разбираюсь в C, поэтому код мне не совсем понятен.