2014-11-17 13 views
5

पर केस असंवेदनशील तरीके से टेक्स्ट की तुलना कैसे करें I AnsiSameText का उपयोग कर एक असंवेदनशील तरीके से ओएसएक्स पर दो तारों की तुलना करने की कोशिश कर रहा हूं। यह ठीक काम करने के लिए प्रयोग किया जाता था, लेकिन ओएसएक्स योसेमेट पर यह अजीब व्यवहार करता है अगर ओएसएक्स की "पसंदीदा भाषा" डच ("सिस्टम प्राथमिकताएं" -> "भाषा & क्षेत्र" -> "पसंदीदा भाषाएं" -> "नेडरलैंड्स डच ")।ओएसएक्स योसेमेट

निम्नलिखित कोड नमूने में मुझे उम्मीद है कि यह केवल "समान" प्रिंट करेगा। लेकिन मुझे "एक ही, अलग, अलग" मिलता है। एक मामले असंवेदनशील तरीके से ग्रंथों की तुलना करने का सही तरीका

program Project2; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    System.SysUtils; 

begin 
    if AnsiSameText('abcde', 'ABCDE') then // Same 
    WriteLn('Same') 
    else 
    WriteLn('Different'); 

    if AnsiSameText('abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') then // different 
    WriteLn('Same') 
    else 
    WriteLn('Different'); 

    if AnsiSameText('i', 'I') then // different 
    WriteLn('Same') 
    else 
    WriteLn('Different'); 
end. 

क्या है?

मैं डेल्फी एक्सई 7 का उपयोग कर रहा हूं।

+0

यह व्यवहार स्पष्ट रूप से गलत है। क्या आपको डेल्फी के विभिन्न संस्करणों पर एक ही आउटपुट मिलता है? ओएसएक्स के विभिन्न संस्करण? जब आप 'AnsiSameText' डीबग करते हैं तो क्या होता है। आपके पास इसके लिए स्रोत कोड है। –

+0

AnsiSameText 'CFStringCompareWithOptionsAndLocale' रिटर्न -1 में डिबगिंग करते समय। ओएसएक्स 10.9 पर AnsiSameText अपेक्षा के अनुसार काम करता है। मैंने XE5 और XE7 की कोशिश की, यह दोनों संस्करणों में विफल रहता है। जैसे ही मैं ओएसएक्स 10.10 की भाषा को अंग्रेजी में बदलता हूं, AnsiSameText अपेक्षा के अनुसार काम करता है। लेकिन मैं अपने डच उपयोगकर्ताओं को उनके ओएस की भाषा स्विच करने के लिए नहीं कह सकता। –

+1

अगला चरण एक ओबीजे-सी प्रोग्राम लिखना है जो इन तारों को 'CFStringCompareWithOptionsAndLocale' पर पास करता है और समस्या को ठीक कहां से सीमित करने का प्रयास करता है। यह थोड़ा सा लगता है जैसे ओएसएक्स संस्करण परिवर्तन यहां कुंजी है। लेकिन यह हो सकता है कि 'CFStringCompareWithOptionsAndLocale' के आसपास डेल्फी रैपर हमेशा टूटा गया है और नया संस्करण दोष को हाइलाइट करने के लिए होता है। एम्बा को इस मुद्दे को देखने का मौका देने के लिए आप डेल्फी गुणवत्ता पोर्टल पर अपना उदाहरण प्रोग्राम भी सबमिट कर सकते हैं। बीटीडब्ल्यू, एक शानदार एमसीवीई के लिए +1। –

उत्तर

0

डेल्फी ने CFLocaleCopyCurrent से लौटाए गए मूल्य के साथ UTF8CompareLocale शुरू किया। UTF8CompareLocale का उपयोग स्थानीय सेटिंग्स के लिए AnsiSameText के अंदर किया जाता है जो केस असंवेदनशील तुलना के लिए उपयोग किया जाता है। लेकिन ओएसएक्स योसेमेट ओएसएक्स की भाषा डच पर सेट होने पर "मैं" और "मैं" अलग मानती है।

डच सिस्टम पर SetUTF8CompareLocale('en_US'); पर कॉलिंग डेल्फी इकाइयों को पैच किए बिना समस्या को हल करता है।

+0

यह समस्या को ठीक नहीं करता है। यह सिर्फ आपके प्रोग्राम को अंग्रेजी लोकेल का उपयोग करता है। आप डिफ़ॉल्ट लोकेल का उपयोग क्यों नहीं करते हैं। –

+0

मुझे सिस्टम को पैच करना होगा। इसके लिए उपयोग करें। अगर मैं शून्य या CFLocaleGetSystem पास करता हूं तो ओएसएक्स अंग्रेजी सॉर्ट ऑर्डर का भी उपयोग करता है। (प्राथमिक भाषा के रूप में तुर्की के साथ "एआईटी" और "एआईटी" की तुलना करने का प्रयास करें)। जैसे ही डच सॉर्ट ऑर्डर का उपयोग किया जाता है, मैं और मैं अलग-अलग अक्षर हैं। तो यह स्पष्ट रूप से एक विकल्प नहीं है। –