2012-02-27 11 views
6

मैं दो स्ट्रिंग की तुलना करने के लिए कोड लिखने की कोशिश कर रहा हूं। विंडोज़ में मैं strcmp का उपयोग कर सकता हूं लेकिन मुझे मल्टीबाइट वर्ण स्ट्रिंग के लिए लिखना है ताकि यह अन्य सभी प्लेटफॉर्म के अनुकूल हो। क्या मैं memcmp का उपयोग कर सकता हूं? यदि नहीं तो कोई अन्य एपीआई है जिसका मैं उपयोग कर सकता हूं या मुझे अपना खुद का एपीआई लिखना होगा।क्या मैं memcmp दो का उपयोग multibyte वर्ण स्ट्रिंग की तुलना कर सकता हूं?

+3

यह इस बात पर निर्भर करता है कि दो तार एक ही एन्कोडिंग का उपयोग कर रहे हैं या नहीं। –

उत्तर

1

तार दोनों एक ही एन्कोडिंग का उपयोग करते हैं, memcmp ठीक काम करेंगे। ध्यान रखें कि विभिन्न प्लेटफार्मों पर विस्तृत वर्ण अलग-अलग आकार हैं।

तार विभिन्न एन्कोडिंग का उपयोग करते हैं, तो आप इस तरह के आईसीयू इससे निपटने के लिए के रूप में एक पुस्तकालय की आवश्यकता होगी।

2

दो तार समान कूट का उपयोग कर रहे हैं, तो आप memcmp उपयोग कर सकते हैं। यदि वे यूटीएफ -8 का उपयोग कर रहे हैं, तो आप strcmp का भी उपयोग कर सकते हैं, क्योंकि 0 यूटीएफ -8 एन्कोडेड स्ट्रिंग्स में दिखाई नहीं देता है। एक और विकल्प mbstowcs का उपयोग करके अपने तारों को विस्तृत वर्णों में परिवर्तित करना है।

+0

इसमें झूठे नकारात्मक होंगे - दो समान तारों को विभिन्न बाइट पैटर्न में एन्कोड किया जा सकता है। आपको यूनिकोड समझदार फ़ंक्शन से तुलना करने की आवश्यकता है। – StilesCrisis

+0

@StilesCrisis - क्या आप एक उदाहरण प्रदान कर सकते हैं कि समान तारों में अलग-अलग यूटीएफ -8 एन्कोडिंग कैसे हो सकती हैं? या, उस मामले के लिए, यह किसी अन्य सिग्नल एन्कोडिंग (जैसे आईएसओ 885 9 -1) के साथ कैसे हो सकता है? मैंने यह मुद्दा बना दिया कि तारों को एक ही एन्कोडिंग का उपयोग करने की आवश्यकता है। –

+0

@ टेड हॉप: यूटीएफ -8 के साथ, आप ओवरलैंग-फॉर्म में एक वर्ण को एन्कोड कर सकते हैं (एक अनुक्रम जो एक मान को डीकोड करता है जो एक छोटे अनुक्रम का उपयोग करना चाहिए: यह वाक्य विकिपीडिया से है)। इस मामले में, memcmp गलत जवाब देता है लेकिन यूटीएफ -8 जागरूक तुलना फ़ंक्शन सही उत्तर देता है ... – Malkocoglu

5

आप सावधान रहना होगा। मैं यूनिकोड/मल्टी बाइट एन्कोडिंग पर एक विशेषज्ञ नहीं हूं, लेकिन मुझे पता है कि डाइक्रिटिक्स के साथ कभी-कभी दो तारों को समान माना जा सकता है जब उनके बाइट बिल्कुल समान नहीं होते हैं। पूर्व-परीक्षण API का उपयोग करने की अनुशंसा की जाती है, क्योंकि स्ट्रिंग एन्कोडिंग बहुत गन्दा हो सकती है।

the old new thing on case mapping देखें। मैं उच्चारविज्ञान के संदर्भ के बारे में नहीं सोच सकता लेकिन अगर मैं करता हूं तो मैं इसे पोस्ट करूंगा।

+0

यह सही है। कुछ मामलों के लिए, एक 'memcmp' काम करेगा। 100% शुद्धता के लिए, और विशेष रूप से यदि किसी भी रूप में यूनिकोड शामिल है, तो 'memcmp' काम नहीं करेगा। यहां तक ​​कि 'é' जैसे साधारण वर्णों को एक से अधिक तरीकों से प्रदर्शित किया जा सकता है - या तो' é' (एक यूनिकोड वर्ण), या 'ई' के साथ संयुक्त '' 'के रूप में' (दो यूनिकोड वर्णों में) के रूप में। अधिकांश समय, ये मिश्रित और मेल नहीं खाते हैं, इसलिए आपको पहले कोई समस्या नहीं दिखाई दे सकती है, लेकिन आखिर में यह आपको काट देगा। – StilesCrisis

+0

एक और तरीका जिसमें तारों को बराबर 'माना' जा सकता है, लेकिन बाइट-बराबर नहीं है यदि आपकी तुलना केस परिवर्तक है। इस मामले में आपको केस फोल्डिंग कहा जाता है, जो ऊपरी केस, लोअर केस, टाइटल केस और केस इनवेरिएंट ग्लाइफ की तुलना करने की अनुमति देता है (जैसा कि ऊपर बताया गया है, कई कोड पॉइंट्स के रूप में प्रदर्शित स्मृति में हो सकता है ... या नहीं)। – Bingo

+0

सामान्यीकरण के बराबर बराबर समान नहीं है। यह सामान्यीकरण का पूरा बिंदु है। ओपी पूछ रहा था कि क्या दो स्ट्रिंग स्ट्रिंग बराबर हैं, भले ही वे बराबर हों या नहीं। –

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