2014-11-12 5 views
6

मैं एक कोड समीक्षा के माध्यम से जा रहा हूं और मुझे उत्सुकता है कि मामले को अनदेखा करते समय तुलना करने की कोशिश करते समय स्ट्रिंग को जावास्क्रिप्ट में ऊपरी या निचले मामले में परिवर्तित करना बेहतर होता है।जावास्क्रिप्ट में toLowerCase या ToUpperCase का उपयोग कर तारों की तुलना करना बेहतर है?

तुच्छ उदाहरण:

var firstString = "I might be A different CASE"; 
var secondString = "i might be a different case"; 
var areStringsEqual = firstString.toLowerCase() === secondString.toLowerCase(); 

या मैं यह कर देना चाहिए:

var firstString = "I might be A different CASE"; 
var secondString = "i might be a different case"; 
var areStringsEqual = firstString.toUpperCase() === secondString.toUpperCase(); 

यह बहुत या, केवल अंग्रेजी अक्षरों की तरह सीमित वर्ण सेट के साथ काम करेगा "चाहिए" या तो यह एक और की तरह लगता है दूसरे की तुलना में मजबूत?

एक नोट के रूप में, MSDN को अपरकेस में सामान्य तार की सिफारिश की है, लेकिन यह प्रबंधित कोड के लिए है (शायद सी # & एफ # पर वे कल्पना StringComparers और आधार पुस्तकालय हैं): http://msdn.microsoft.com/en-us/library/bb386042.aspx

+0

चूंकि अधिकांश तारों में अधिक लोअरकेस होगा, कम से कम लोअरकेस में कनवर्ट करने के लिए इलाज के लिए कम वर्ण होंगे लेकिन अन्य तो .. क्या कोई अंतर है? –

+1

मुझे यकीन नहीं है कि जावास्क्रिप्ट में कोई अन्य अंतर है, एमएसडीएन लिंक कहता है कि कुछ पात्र हैं जो एक गोल यात्रा नहीं कर सकते हैं - "तारों को अपरकेस के लिए सामान्यीकृत किया जाना चाहिए। वर्णों का एक छोटा समूह, जब वे परिवर्तित होते हैं लोअरकेस के लिए, एक राउंड ट्रिप नहीं कर सकता है। राउंड ट्रिप बनाने के लिए पात्रों को एक लोकेल से दूसरे लोकेल में परिवर्तित करना है जो चरित्र डेटा को अलग-अलग दर्शाता है, और फिर परिवर्तित वर्णों से मूल पात्रों को सटीक रूप से पुनर्प्राप्त करने के लिए। " - लेकिन मुझे यकीन नहीं है कि यह अद्वितीय है या नहीं। अगर यह सभी/अधिकांश प्रोग्रामिंग भाषाओं पर लागू होता है। –

+1

मैं अनुमान लगा रहा हूं कि यह ब्राउज़र किस प्रकार निर्भर करता है कि वे दो तरीके आंतरिक रूप से कैसे काम करते हैं, लेकिन वे दोनों शायद पात्रों पर पुन: प्रयास करते हैं और जांचते हैं और उन्हें परिवर्तित करते हैं, इसलिए इससे कोई फर्क नहीं पड़ता। वास्तविक जीवन में, यह निश्चित रूप से कोई फर्क नहीं पड़ता। – adeneo

उत्तर

9

संशोधित उत्तर

यह काफी समय हो गया जब मैंने इस प्रश्न का उत्तर दिया। जबकि सांस्कृतिक मुद्दों को अभी भी सच है (और मुझे नहीं लगता कि वे कभी भी चले जाएंगे), ECMA-402 मानक के विकास ने मेरा मूल उत्तर ... पुराना (या अप्रचलित?) बनाया। !

var locale = 'en'; // that should be somehow detected and passed on to JS 
var firstString = "I might be A different CASE"; 
var secondString = "i might be a different case"; 
if (firstString.localeCompare(secondString, locale, {sensitivity: 'accent'}) === 0) { 
    // do something when equal 
} 

यह दो तार केस-संवेदी, लेकिन लहजे के प्रति संवेदनशील की तुलना करेंगे (उदाहरण के लिए एक = एक:

स्थानीय तार की तुलना के लिए सबसे अच्छा समाधान उचित स्थानों और विकल्पों के साथ समारोह toLocaleCompare() का उपयोग कर किया जा रहा है)।
यदि यह प्रदर्शन के कारणों के लिए पर्याप्त नहीं है, तो आप एक पैरामीटर के रूप में स्थान गुजर या तो toLocaleUpperCase() या toLocaleLowerCase() उपयोग कर सकते हैं:

if (firstString.toLocaleUpperCase(locale) === secondString.toLocaleUpperCase(locale)) { 
    // do something when equal 
} 

सिद्धांत रूप में वहाँ कोई मतभेद नहीं होना चाहिए। अभ्यास, सूक्ष्म कार्यान्वयन विवरण (या दिए गए ब्राउज़र में कार्यान्वयन की कमी) अलग परिणाम उपज सकता है ...

मूल जवाब

में मुझे यकीन है कि यदि आप वास्तव में Internationalization (i18n) में यह सवाल पूछने के लिए मतलब नहीं कर रहा हूँ टैग, लेकिन चूंकि आपने किया ...
शायद सबसे अप्रत्याशित उत्तर है: न तो

मामले रूपांतरण के साथ tons of problems हैं, जो अनिवार्य रूप से कार्यात्मक मुद्दों की ओर जाता है यदि आप भाषा को इंगित किए बिना वर्ण केस को परिवर्तित करना चाहते हैं (जैसे जावास्क्रिप्ट केस में)। उदाहरण के लिए:

  1. ऐसी कई प्राकृतिक भाषाएं हैं जिनमें ऊपरी और लोअरकेस वर्णों की अवधारणा नहीं है। उन्हें बदलने की कोशिश में कोई बिंदु नहीं (हालांकि यह काम करेगा)।
  2. स्ट्रिंग को बदलने के लिए भाषा विशिष्ट नियम हैं। जर्मन sharp S चरित्र (ß) को दो ऊपरी मामले एस अक्षरों (एसएस) में परिवर्तित करने के लिए बाध्य किया गया है।
  3. तुर्की और अज़रबैजानी (या अज़ेरी अगर आप पसंद करते हैं) है "बहुत ही अजीब" concept of two i characters: dotless मैं (जो अपरकेस मैं करने के लिए धर्मान्तरित) और मैं बिंदीदार (जो अपरकेस मैं < धर्मान्तरित - इस फ़ॉन्ट सही प्रस्तुति के लिए अनुमति नहीं है, लेकिन यह वास्तव में अलग ग्लिफ है)।
  4. ग्रीक भाषा में कई "अजीब" रूपांतरण नियम हैं। एक विशेष नियम अपरकेस अक्षर sigma (Σ) के संबंध में है जो किसी शब्द में किसी स्थान पर निर्भर करता है जिसमें दो लोअरकेस समकक्ष होते हैं: नियमित सिग्मा (σ) और अंतिम सिग्मा (ς)। "उच्चारण" वर्णों के संबंध में अन्य रूपांतरण नियम भी हैं, लेकिन रूपांतरण फ़ंक्शन के कार्यान्वयन के दौरान उन्हें आमतौर पर छोड़ा जाता है।
  5. कुछ भाषाओं has title-case letters, i.e. Lj जिसे LJ या कम उचित एलजे जैसी चीजों में परिवर्तित किया जाना चाहिए। यह ligatures के संबंध में हो सकता है।
  6. अंत में कई compatibility characters हैं जो इसका अर्थ हो सकता है कि आप तुलना करने की कोशिश कर रहे हैं, लेकिन पूरी तरह से अलग-अलग वर्णों से बना है। इसे और भी खराब बनाने के लिए, "एई" जैसी चीजें जर्मन और फिनिश में "ä" के बराबर हो सकती हैं, लेकिन डेनिश में "æ" के बराबर होती हैं।

मैं आपको यह विश्वास दिलाने की कोशिश कर रहा हूं कि उपयोगकर्ता रूपांतरण की तुलना करना वास्तव में बेहतर है, इसे बदलने के बजाय। यदि यह उपयोगकर्ता से संबंधित नहीं है, तो इससे कोई फर्क नहीं पड़ता, लेकिन केस रूपांतरण में हमेशा समय लगेगा। क्यों परेशान?

1

यह कभी नहीं ब्राउज़र पर निर्भर करता है के रूप में यह है केवल जावास्क्रिप्ट जो शामिल है। दोनों पर पात्रों में से कोई (flipping मामले)

var areStringsEqual = firstString.toLowerCase() === secondString.toLowerCase(); 
var areStringsEqual = firstString.toUpperCase() === secondString.toUpperCase(); 

आप @adeneo आप इसे ब्राउज़र निर्भर है महसूस कर सकते हैं, लेकिन जैसे कुछ अन्य परीक्षण आदानों बनाने के द्वारा तैयार परीक्षण का उपयोग करते हैं "परिवर्तित करने की आवश्यकता आधारित प्रदर्शन दे देंगे AAAAAAAAAAAAAAAAAAAAAAAAAAAA "&" aaaaaaaaaaaaaaaaaaaaaaa "और तुलना करें।

जावास्क्रिप्ट प्रदर्शन ब्राउज़र पर निर्भर करता है यदि कुछ डोम एपीआई या कोई डोम हेरफेर/इंटरैक्शन वहां है, अन्यथा सभी सादे जावास्क्रिप्ट के लिए यह एक ही प्रदर्शन देगा।

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