2014-10-30 4 views
9

बहुत सारे उदाहरण हैं और जब java.lang.String.equalsIgnoreCase लोकेल के गलत उपयोग के कारण विफल हो जाएंगे।जावा के बराबर इग्नोरकेस का सही विकल्प क्या है?

लेकिन मुझे सही तरीके से कोई उदाहरण नहीं मिला। java.lang.String.toUpperCase के विपरीत लोकेल पैरामीटर के साथ कोई संस्करण नहीं है। ऊपरी या निचले मामले में दोनों तारों को परिवर्तित करना अपमानजनक प्रतीत होता है। विशेष रूप से जब आप बहुत अधिक तुलना करने वाले आवेदन पर काम कर रहे होते हैं।

अनदेखा केस स्ट्रिंग तुलना करने का सही तरीका क्या है, दोनों लोकेल और प्रदर्शन को ध्यान में रखते हुए?

+1

शायद एक ['कोलेटर '] (http://docs.oracle.com/javase/8/docs/api/java/text/Collator.html) का उपयोग करके? – fge

+2

क्या आप अपने प्रश्न को उदाहरण के साथ'equalsIgnoreCase() 'के गलत परिणामों के रूप में संपादित करना चाहते हैं? मैं काफी उत्सुक हूं ... – fge

+0

@fge तुर्की «i» और जर्मन «ß» सबसे अधिक उद्धृत विफलताओं प्रतीत होता है। लेकिन आप सही हैं, मैं बाद में कुछ उदाहरण जोड़ता हूं। – Martin

उत्तर

1

this page के अनुसार, आप कोलेटर केस संवेदी समानता करने के लिए इस प्रकार के रूप में उपयोग कर सकते हैं:

//retrieve the runtime user's locale 
Locale locale = new Locale(getUserLocale()); 

//pass the user's locale as an argument 
Collator myCollator = Collator.getInstance(locale); 

//set collator to Ignore case but not accents 
//(default is Collator.TERTIARY, which is 
//case sensitive) 
myCollator.setStrength(Collator.SECONDARY); 

int i = myCollator.compare(stringA,stringB); 

(ऊपर साइट से कॉपी किया गया ...)

जाहिर है, अन्य संदर्भों में आप चुन सकते हैं लोकेल अलग-अलग।


@fge के लिए - यह ओरेकल बग रिपोर्ट कुछ ऐसी बातें ऐसा होता है का एक उदाहरण देता है।

+0

धन्यवाद! और वास्तव में कुछ कोड खोजने के लिए समय निकालने के लिए ... – fge

0

एक संभावित विकल्प के Regex का दुरुपयोग कर सकता है। यह काफी प्रदर्शन गहन गतिशील रूप से बदलती तार के साथ है, लेकिन अगर आप स्थिरांक के खिलाफ तुलना कर रहे हैं यह एक विकल्प हो सकता:

Matcher matcher = Pattern.compile("^" + myOtherString + "$", 
    Pattern.CASE_INSENSITIVE | Pattern.LITERAL | Pattern.UNICODE_CASE).matcher(); 
if (matcher.matches(myString)) { 
    // ... 
} 

इस स्ट्रिंग आप के खिलाफ की तुलना करना चाहते एंकर निर्दिष्ट करता है यूनिकोड-अवगत केस-संवेदी शाब्दिक स्ट्रिंग का मिलान।

+0

मैं भविष्यवाणी करता हूं कि 'String.equalsIgnoreCase' का उपयोग करने के समान समस्या होगी। तुलना को केवल अनिकोड के बारे में पता नहीं, स्थानीय लोगों को जागरूक होना चाहिए। ('String.equalsIgnoreCase' भी 'स्ट्रिंग' javadocs के अनुसार यूनिकोड जागरूक है।) –

+0

@StephenC इसके बारे में अच्छा हिस्सा यह है कि आपके उत्तर में दिए गए एक्सपेल में एक ही समस्या नहीं होगी। ß -> एसएस समस्या इस तथ्य से आती है कि ß के बराबर कोई अपरकेस नहीं है। केवल ß मैच ß से होगा और एसएस ** ** ** ß मैच नहीं करेगा (जैसा कि यह बराबर होता है IgnoreCase();) – Vogel612

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