2012-09-05 12 views
6

से लहजे को हटाकर मैं एक उच्चारण से असंवेदनशील खोज शुरू करने के लिए एक स्ट्रिंग से उच्चारण और अधिक आम तौर पर diacritic अंक को हटाना चाहता हूं। यूनिकोड वर्ण वर्गों पर कुछ पढ़ने के आधार पर, मैं इस के साथ आ गया है:क्यूस्ट्रिंग

QString unaccent(const QString s) 
{ 
    QString s2 = s.normalized(QString::NormalizationForm_D); 
    QString out; 
    for (int i=0,j=s2.length(); i<j; i++) 
    { 
    // strip diacritic marks 
    if (s2.at(i).category()!=QChar::Mark_NonSpacing && 
     s2.at(i).category()!=QChar::Mark_SpacingCombining) 
    { 
      out.append(s2.at(i)); 
    } 
    } 
    return out; 
} 

यह लैटिन-आधारित भाषाओं के लिए काफी अच्छा काम करने के लिए प्रकट होता है, लेकिन मैं अन्य अक्षर पर अपनी पर्याप्तता के बारे में सोच रहा हूँ: अरबी , सिरिलिक, सीजेके ... जो कि इनकी सांस्कृतिक समझ की कमी के कारण मैं परीक्षण नहीं कर सकता।

विशेष रूप से मैं चाहता हूँ मैं जानता हूँ कि चाहते हैं:

  1. क्या यूनिकोड सामान्य रूप से इस समस्या के लिए बेहतर अनुकूल है: NormalizationForm_KD या NormalizationForm_D?
  2. Mark_NonSpacing और Mark_SpacingCombining श्रेणियों से संबंधित वर्णों को निकालने के लिए पर्याप्त है या इसमें अधिक श्रेणियां शामिल होनी चाहिए?
  3. क्या उपरोक्त कोड में अन्य सुधार हैं जो इसे सभी भाषाओं के लिए यथासंभव सर्वोत्तम काम करेंगे?
+1

आप जिस तरह से भी 'QChar :: Mark_Enclosing' –

+0

NFD का सवाल चाहते बनाम NFKD कुछ आप आप क्या करने की कोशिश कर रहे हैं के आधार पर तय की जरूरत है। यह तय करने के लिए कि क्या आप उस सीमा को किसी चरित्र को विघटित करना चाहते हैं, [यूनिकोड सामान्यीकरण फ़ॉर्म] [1] के "चित्र 6" देखें। मुझे संदेह है कि आप एनएफडी चाहते हैं। –

+0

@ डेव: मुझे लगता है [1] था: http://www.unicode.org/reports/tr15/ –

उत्तर

0
QString unaccent(const QString s) 
{ 
    QString output(s.normalized(QString::NormalizationForm_D)); 
    return output.replace(QRegExp("[^a-zA-Z\\s]"), ""); 
} 
+2

यह कोड बहुत अधिक स्ट्रिप्स करता है। लैटिन वर्णमाला के बाहर अंक, विराम चिह्न और गैर-उच्चारण वर्णों को रखा जाना चाहिए, जबकि यह कोड उन्हें हटा देता है। Diacritic अंकों को छोड़कर कुछ भी रखा जाना चाहिए। –

संबंधित मुद्दे