मैं सी # के लिए मेटाफोन कार्यान्वयन का परीक्षण कर रहा हूं और PHP से अंतर्निहित मेटाफोन() फ़ंक्शन के विरुद्ध इसके परिणामों की तुलना कर रहा हूं। हालांकि, मैं एक बग में आया हूं (जो previously documented in PHP's issue tracker है और a mailing list पर चर्चा की गई), लेकिन मैं अपनी व्यक्तिगत रुचि के लिए अपने बग के पीछे सी कोड को समझने की कोशिश कर रहा हूं।PHP मेटाफोन कार्यान्वयन बग
मूल रूप से, मेटाफोन एल्गोरिदम के अनुसार, अधिकांश उदाहरणों को चुप किया जाना चाहिए। "राइट" की विशेष परीक्षा मामले में, मुझे उम्मीद है (और मेरे अपने एल्गोरिथ्म के साथ उत्पन्न) "आरटी" की एक metaphone कुंजी
"wr" => R
"i" => ignored
"gh" => ignored
"t" => T
Result: RT
हालांकि, PHP के metaphone समारोह आरएफटी देता है। जाहिर है, यह एक एफ को परिवर्तित कर रहा है, जैसे कि यह एक शब्द (जैसे "मोटा") के अंत में था, लेकिन "wright" शब्द के मामले में, यह गलत है, क्योंकि -gh- करता है शब्द के अंत में नहीं आते हैं।
/* 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 पर: पीएचपी स्रोत वितरण में metaphone.c फ़ाइल को देखते हुए, मैं कुछ महत्वपूर्ण चीजों को देखने के
case 'G':
if (Next_Letter == 'H') {
if (!(NOGHTOF(Look_Back_Letter(3)) || Look_Back_Letter(4) == 'H')) {
Phonize('F');
skip_letter++;
किसी की मदद कर सकते हैं मुझे समझने वास्तव में क्या NOGHTOF समारोह क्या और यह कोड "wright" में गलत तरीके से एफ को प्रतिपादित क्यों कर रहा है? मैं वास्तव में एक सी लड़का नहीं हूं, इसलिए कोड मुझे बिल्कुल स्पष्ट नहीं है।
तो शायद कोई सूची में पैच सबमिट कर सकता है और यह बग तय कर सकता है! –
SO इस तरह के अधिक प्रश्नों की आवश्यकता है :) –