Ошибка реализации метафона PHP

Я тестирую реализацию метафона для 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, поэтому код мне не совсем понятен.

7
задан Charles 14 February 2012 в 00:16
поделиться