9

मैं जावास्क्रिप्ट में दो तारों की तुलना करना चाहता हूं, और फिर भी समानता ऑपरेटर == झूठा रिटर्न देता है। एक स्ट्रिंग में एक विशेष चरित्र होता है (उदाहरण के लिए डैनिश å)।यूनिकोड वर्णों की तुलना करते समय जावास्क्रिप्ट स्ट्रिंग तुलना विफल हो जाती है

जावा स्क्रिप्ट कोड:

var filenameFromJS = "Designhåndbog.pdf"; 
var filenameFromServer = "Designhåndbog.pdf"; 

print(filenameFromJS == filenameFromServer); // This prints false why? 

समाधान क्या मेरे लिए काम किया यूनिकोड सामान्य रूप slevithan बताया है।

मैंने अपने मूल jsfiddle को स्लेविथान द्वारा सुझाए गए सामान्यीकरण lib का उपयोग करके एक संस्करण बनाने के लिए फोर्क किया। लिंक: http://jsfiddle.net/GWZ8j/1/

+0

'के बारे में ==' 'बनाम ===' http://stackoverflow.com/questions/359494 यह लेख देखें/जावास्क्रिप्ट-बनाम-करता-यह-पदार्थ-जो-बराबर-ऑपरेटर-i-use – Steve

+4

@Steve जब दोनों ऑपरेंड एक ही प्रकार के होते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप ढीले या सख्त तुलना का उपयोग करते हैं। – PointedEars

उत्तर

10

यहां कुछ अन्य लोगों के विपरीत क्या है, इसका एन्कोडिंग के साथ कुछ लेना देना नहीं है। इसके बजाय, आपके दो तार एक ही दृश्य वर्ण प्रस्तुत करने के लिए अलग-अलग कोड बिंदुओं का उपयोग करते हैं।

इसे सही ढंग से हल करने के लिए, आपको तुलना करने से पहले दो तारों पर यूनिकोड सामान्यीकरण करने की आवश्यकता है। अनजाने में, जावास्क्रिप्ट में यह कार्यक्षमता नहीं है। यहां एक जावास्क्रिप्ट लाइब्रेरी है जो आपके लिए सामान्यीकरण कर सकती है: https://github.com/walling/unorm

+1

ओह, मैं उम्मीद कर रहा था कि यह जवाब न प्राप्त करें :-) कि मैं अभी स्पष्ट था और इस सरल कार्य के लिए लाइब्रेरी की आवश्यकता नहीं होगी। उत्तर के लिए धन्यवाद मैं इसे आज़मा दूंगा। – tougher

+0

आप सही हैं, मुझे याद आया है कि 'सी +8 ए' यूटीएफ -8 कोड अनुक्रम 'यू +30 ए कमिंग रिंग एबॉव' के लिए है, जो पहले 'ए' से पहले है। अन्य स्ट्रिंग में 'सी 3 ए 5' है जो यूटीएफ -8 में 'यू +00 ई 5 लैटिन लघु लिटर ए रिंग एबॉव' को एन्कोड करता है। आईआईआरसी, मैक ओएस संयोजन पात्रों को पसंद करता है, जबकि अन्य ओएस एकल-ग्लाइफ फॉर्म पसंद करते हैं। सर्वर को किसी एक को परिवर्तित करना संभव होना चाहिए, हालांकि, कोई बड़ी क्लाइंट-साइड लाइब्रेरी आवश्यक नहीं है। – PointedEars

+0

PointedEars, यह आवश्यक रूप से संभव या आदर्श नहीं है। उदाहरण के लिए, हो सकता है कि आप स्ट्रिंग तुलना करने के लिए बस सर्वर राउंड ट्रिप नहीं करना चाहें, या आप सर्वर पर जावास्क्रिप्ट का उपयोग कर रहे हों। @ टौघर, जावास्क्रिप्ट के भविष्य के संस्करणों में यूनिकोड सामान्यीकरण जोड़ने का एक प्रस्ताव है। देखें [स्ट्रॉमैन: यूनिकोड_नोर्मलाइजेशन] (http://wiki.ecmascript.org/doku.php?id=strawman:unicode_normalization)। – slevithan

1

यूटीएफ -8 एक जटिल बात है। वर्णमाला में á, इत्यादि जैसे वर्णों के लिए दो अलग-अलग कोड हैं। जैसा कि आप पहले से ही यूआरएल एन्कोडेड संस्करण में देखते हैं, एचईएक्स बाइट्स जिसमें से चरित्र दोनों संस्करणों के लिए भिन्न होता है।

अधिक जानकारी के लिए this उत्तर देखें।

+0

जेएफटीआर: यूनिकोड _not_ UTF-8 है। यूनिकोड एक चरित्र सेट और कई एन्कोडिंग के लिए एक मानक है; यूटीएफ -8 उन एन्कोडिंग में से एक है। – PointedEars

+0

@PointedEars फिक्स्ड। – user2428118

+0

अब आप कह रहे हैं कि यूटीएफ -8 एक चरित्र सेट था। यह नहीं। मैं यह भी निश्चित हूं कि आपका आधार गलत है: यूटीएफ -8 कोड अनुक्रम 0xCC से शुरू नहीं हो सकता है। – PointedEars

5

जावास्क्रिप्ट समानता ऑपरेटर == निम्न परिस्थितियों में विफल रहा प्रतीत होता है। सभी मामलों में यह प्रोग्रामर त्रुटि है। जावास्क्रिप्ट में एक बग नहीं है।

  1. दो तारों में समान संख्या और वर्णों का अनुक्रम नहीं होता है।

  2. एक स्ट्रिंग के अंदर या उसके बाद पहले व्हाइटस्पेस या न्यूलाइन है। दोनों पर एक ट्रिम() ऑपरेटर का उपयोग करें और दोनों तारों पर बारीकी से देखो।

  3. आश्चर्य टाइपकास्टिंग। प्रोग्रामर डाटाटाइप की तुलना कर रहा है जो असंगत हैं।

  4. यूनिकोड वर्ण हैं जो अन्य यूनिकोड वर्णों के समान दिखते हैं लेकिन वास्तव में अलग-अलग यूनिकोड वर्ण हैं।

+0

+1, क्योंकि यह उत्तर स्वीकार्य एक से अधिक जानकारीपूर्ण तरीका है और इसमें नोडजेएस या jQuery के साथ कुछ शामिल नहीं है। – unexist

+0

इस मामले में संख्या 4 अपराधी – vahanpwns

+0

विभिन्न यूनिकोड सामान्यीकरण विभिन्न वर्णों के बारे में नहीं है, लेकिन इसका मतलब है कि एक ही चरित्र को संदर्भित करने के लिए विभिन्न यूनिकोड कोड बिंदु अनुक्रमों का उपयोग किया गया था। – James

0

मुझे यह समस्या थी।

HTML फ़ाइल में

<meta charset="UTF-8"> 

जोड़ा जा रहा है समस्या का समाधान हो।

मेरे मामले में टेम्पलेटिंग इंजन HTML फ़ाइल में एक जेसन स्ट्रिंग को बेक कर रहा था। यह स्ट्रिंग यूनिकोड में थी।

जबकि टेम्पलेट एक यूनिकोड फ़ाइल भी था, जेएस इंजन एक लैटिन -1 एन्कोडेड स्ट्रिंग के रूप में टेम्पलेट में लिखे गए स्ट्रिंग का इलाज कर रहा था, जब तक कि मैंने मेटा टैग नहीं जोड़ा।

मैं की तुलना की गई थी JSON से एक के लिए स्ट्रिंग में टाइप वस्तुओं आइटम (location.title == "Mühle")

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

  • कोई संबंधित समस्या नहीं^_^