2008-12-01 10 views
13

मुझे एक जवाब मिला है कि स्टैक ओवरफ्लो पर डाइक्रिटिक वर्णों को कैसे हटाया जाए, लेकिन क्या आप कृपया मुझे बता सकते हैं कि क्या डायक्रिटिक वर्णों को गैर-विशिष्ट लोगों में बदलना संभव है?डायक्रिटिक वर्णों को गैर-डायक्रिटिक वाले लोगों को कैसे बदलें

ओह .. और मैं नेट के बारे में सोचना (या यदि संभव नहीं अन्य)

+0

जब मुझे पेर्ल में ऐसा करना पड़ा तो मुझे बस एक बड़ा लंबा हाथ से बनाए रखा "tr" कथन था, तो शुभकामनाएं। –

+0

यह _several_ प्रश्नों का एक डुप्लिकेट है। उदाहरण के लिए, "अनुवाद" की खोज करें। कृपया हमारी भाषाओं को कुचलने मत करो! – hop

उत्तर

10

प्रतिलिपि बनाई जा रही my own answer to another question से:

करने के बजाय अपने खुद के तालिका बनाने, आप के बजाय सामान्य फार्म के लिए पाठ परिवर्तित कर सकते हैं डी, जहां पात्रों को मूल चरित्र के रूप में दर्शाया जाता है और विशेषण (उदाहरण के लिए, "á" को "ए" द्वारा प्रतिस्थापित किया जाएगा जिसके बाद एक तीव्र उच्चारण संयोजन होता है)। फिर आप एएससीआईआई पत्र नहीं है जो सब कुछ पट्टी कर सकते हैं।

तालिकाएं अभी भी मौजूद हैं, लेकिन अब यूनिकोड मानक से हैं।

आप और भी मामलों को पकड़ने के लिए एनएफडी के बजाय एनएफकेडी को भी आजमा सकते हैं।

संदर्भ:

+8

यदि संभव हो तो कृपया ऐसा न करें। आप हमारी भाषाओं को कुचल रहे हैं। लिप्यंतरण – hop

+0

@hop का उपयोग करने का प्रयास करें, ऐसा करने के कई वैध कारण हैं (उदाहरण के लिए व्याख्यात्मक विश्लेषण के लिए सामान्यीकृत एन-ग्राम उत्पन्न करना) – Diadistis

+0

@Diadistis: ए) मुझे नहीं लगता कि उचित लिप्यंतरण उस तरह के विश्लेषण में बाधा डालता है और बी) " कई वैध कारण "? कुछ नाम दें ... – hop

4

यह भी पीछे हटना करने के लिए सार्थक हो सकता है और पर विचार क्यों यदि आप ऐसा करना चाहते हो सकता है। यदि आप चरित्र अंतर को हटाने की कोशिश कर रहे हैं तो आप महत्वहीन मानते हैं, आपको यूनिकोड संयोजन एल्गोरिदम को देखना चाहिए। खोज या सॉर्टिंग के लिए स्ट्रिंग की तुलना करते समय केस या डाइक्रिटिक्स जैसे मतभेदों को नजरअंदाज करने का यह मानक तरीका है।

यदि आप संशोधित पाठ प्रदर्शित करने की योजना बना रहे हैं, तो अपने दर्शकों पर विचार करें। आप सुरक्षित रूप से फ़िल्टर कर सकते हैं लोकेल संवेदनशील है। यूएस अंग्रेजी में, "इग्लू" = "इग्लू", और "फिर से शुरू करें" = "रेज़्यूमे", लेकिन तुर्की में, एक कम मामला मैं ı (डॉटलेस) हूं, और फ्रेंच में, कोटे का मतलब उद्धरण है, कोटे का मतलब है पक्ष, और कोट माध्यम तट। तो, संयोजन भाषा निर्धारित करती है कि अंतर क्या महत्वपूर्ण हैं।

यदि आपके आवेदन के लिए डाइक्रिटिक्स को सही समाधान है, तो अपनी खुद की तालिका का उत्पादन करना सबसे सुरक्षित है जिसमें आप स्पष्ट रूप से उन पात्रों को जोड़ते हैं जिन्हें आप कनवर्ट करना चाहते हैं।

यूनिकोड अपघटन का उपयोग करके एक सामान्य, स्वचालित दृष्टिकोण तैयार किया जा सकता है। इसके साथ, आप अक्षरों के साथ वर्णों को "संयोजन" करने के लिए वर्णों (diacritic अंक) और आधार चरित्र के साथ विघटित कर सकते हैं जिसके साथ वे संयुक्त होते हैं। संयोजन संयोजन वाले किसी भी चीज को फ़िल्टर करें, और आपके पास "गैर-विशिष्ट" होना चाहिए।

स्वचालित विधि में भेदभाव की कमी, हालांकि, कुछ अप्रत्याशित प्रभाव हो सकते हैं। मैं पाठ के प्रतिनिधि निकाय पर बहुत से परीक्षण की सिफारिश करता हूं।

+2

मुझे लगता है कि इसका उपयोग करने में से एक अच्छा यूआरएल –

+0

बिल्कुल तैयार करना है। यदि आपके पास "रेंडी फेय_फैमिली वोकलिस्ट" नामक एक उत्पाद है और आपको यूआरएल स्टब/उत्पाद/कुछ उत्पन्न करने की आवश्यकता है, तो आपके विकल्प अनिवार्य रूप से उच्चारण किए गए हैं एक असंतुलित व्यक्ति के साथ, या यूआरएल से वहां एक बदसूरत प्रतिशत छोड़ने वाली स्ट्रिंग से बचें। असंतुलित एक बहुत बेहतर है। यूआरएल मशीन-पठनीय तार हैं लेकिन अक्सर यह महत्वपूर्ण है कि वे कम से कम अर्ध-मानव-पठनीय हों। –

1

एक सरल उदाहरण के लिए:

एक स्ट्रिंग से विशेषक निकालने के लिए: के बाद से कोई भी कभी भी यह करने के लिए कोड पोस्ट करने के लिए परेशान है

string newString = myDiacriticsString.Normalize(NormalizationForm.FormD); 
+4

नहीं काम: "ě"। Normalize (NormalizationForm.FormD) "e" – Feryt

+0

वापस नहीं करता है हां, यह देखने के लिए स्ट्रिंग.ToCharArray() का उपयोग करें। –

+0

बस Feryt की तरह यह मेरे लिए काम नहीं करता है। ("xxé")। सामान्यीकृत (NormalizationForm.FormD) "xxe" (अपेक्षित की तरह) देता है, लेकिन स्ट्रिंग v = "xxé"; v.Normalize (NormalizationForm.FormD); "xxé" देता है। मैंने v.ToCharArray() और ("xxé") को कॉल करने का प्रयास किया। ToCharArray() यह देखने के लिए कि कोई अंतर है या नहीं, वे एक ही सरणी लौटते हैं। बहुत अजीब ! – AFract

27

, यहाँ यह है:

// \p{Mn} or \p{Non_Spacing_Mark}: 
    // a character intended to be combined with another 
    // character without taking up extra space 
    // (e.g. accents, umlauts, etc.). 
    private readonly static Regex nonSpacingMarkRegex = 
     new Regex(@"\p{Mn}", RegexOptions.Compiled); 

    public static string RemoveDiacritics(string text) 
    { 
     if (text == null) 
      return string.Empty; 

     var normalizedText = 
      text.Normalize(NormalizationForm.FormD); 

     return nonSpacingMarkRegex.Replace(normalizedText, string.Empty); 
    } 

नोट: ऐसा करने की आवश्यकता के लिए एक बड़ा कारण यह है कि जब आप किसी तृतीय पक्ष सिस्टम को एकीकृत कर रहे हैं जो केवल एसीआईआई करता है, लेकिन आपका डेटा यूनिकोड में है। यह आम है। आपके विकल्प मूल रूप से हैं: उच्चारण किए गए अक्षरों को हटाएं, या उच्चारण किए गए अक्षरों से उच्चारण को निकालने का प्रयास करें ताकि आप मूल इनपुट के जितना अधिक कर सकें। जाहिर है, यह एक सही समाधान नहीं है लेकिन यह एसीआईआई 127 के ऊपर किसी भी चरित्र को हटाने से 80% बेहतर है।

0

मेरी साइट बाहरी स्रोतों से डेटा इनपुट करती है जिसमें कई अजीब पात्र होते हैं।

using System.Text; 
    using System.Text.RegularExpressions; 

    internal static string SanitizeString(string source) 
    { 
     return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""[email protected]#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*", string.Empty).Trim();  
    } 

आशा है कि यह मदद करता है: मैं निम्नलिखित सी # समारोह उच्चारण चिह्न वर्ण की जगह और Regex का उपयोग करके गैर अमेरिकी कीबोर्ड पात्रों को निकाल देते हैं करने के लिए लिखा था।

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