2010-05-24 13 views
16

में लोकेल निर्भर हो सकता है सेटलोकेल को कवर करने वाले अनुभाग में, एएनएसआई सी मानक एक फुटनोट में बताता है कि केवल ctype.h फ़ंक्शंस जिनके व्यवहार वर्तमान लोकेल से प्रभावित नहीं हैं, isdigit और isxdigit हैं।वैध रूप से सी

isdigit का माइक्रोसॉफ्ट कार्यान्वयन लोकेल निर्भर है क्योंकि, उदाहरण के लिए, कोड पेज 1250 का उपयोग करने वाले लोकल में केवल 0x30 ('0') - 0x39 ('9') श्रेणी में वर्णों के लिए गैर-शून्य लौटाता है, जबकि कोड पेज 1252 isdigit का उपयोग करने वाले लोकेशंस सुपरस्क्रिप्ट अंक 0xB2 ('²'), 0xB3 ('³') और 0xB9 ('¹') के लिए गैर-शून्य भी लौटाते हैं।

माइक्रोसॉफ्ट आईडीजिट लोकेल निर्भर करते हुए सी मानक का उल्लंघन कर रहा है?

इस प्रश्न में मैं मुख्य रूप से सी 9 0 में रूचि रखता हूं, जो माइक्रोसॉफ्ट का दावा है कि सी 99 के बजाय।

अतिरिक्त पृष्ठभूमि: setlocale की

माइक्रोसॉफ्ट के स्वयं के प्रलेखन गलत तरीके से कहा गया है कि isdigit स्थान के LC_CTYPE भाग से अप्रभावित है।

इन कार्यों के व्यवहार वर्तमान स्थान से प्रभावित होता है:

सी मानक कि ctype.h कार्यों को शामिल किया गया की धारा कुछ शब्दों है कि मैं अस्पष्ट मानते हैं। उन कार्यों को में लोकेल-विशिष्ट पहलू केवल तभी होते हैं जब "सी" लोकेल में नहीं देखा जाता है।

मैं इस अस्पष्ट विचार करें क्योंकि यह स्पष्ट नहीं कि यह क्या इस तरह के isdigit के रूप में कार्य जिसके लिए वहाँ भाषा-विशिष्ट पहलुओं के बारे में कोई सूचना उपलब्ध नहीं के बारे में कहने की कोशिश कर रहा है। यह कहने की कोशिश कर रहा है कि ऐसे कार्यों को लोकेल आश्रित माना जाना चाहिए, इस मामले में माइक्रोसॉफ्ट के इडिजिट का कार्यान्वयन ठीक होगा। (सिवाय कि फुटनोट कि मैंने पहले बताया इस व्याख्या खंडन करने के लिए लगता है।)

उत्तर

6
  1. माइक्रोसॉफ्ट हमेशा सही होता है।
  2. माइक्रोसॉफ्ट सही दिखाई नहीं दे रहा है, तो आइटम 1

माइक्रोसॉफ्ट हमेशा यह कल्पना की अपनी व्याख्या है है। और आम तौर पर वाक्य: "लेकिन माइक्रोसॉफ्ट गलत है", आपके सीईओ के साथ कोई भार नहीं लेता है, इसलिए आपको एमएस बग/व्याख्याओं के आसपास कोड करना होगा।

आईई और आउटलुक के गलत व्यवहार का समर्थन करने के लिए कोड की मात्रा चौंकाने वाली है।

int my_isdigit(int c) 
{ 
#ifdef WIN32 
    your implementation goes here 
#else 
    return isdigit(c); 
#endif 
} 
+1

+1 बहुत व्यावहारिक सोच के लिए :) –

4

आवश्यक वर्ण सेट खंड 2.2.1 में परिभाषित किया गया है:

कई मामलों में, एकमात्र समाधान समारोह है कि सही काम करता है की अपनी संस्करण प्रस्तुत करने और इस तरह कुछ करने के लिए है ।

  • एकल-बाइट $ 2.2.1 में परिभाषित वर्ण वर्तमान में किया जाएगा: धारा 2.2.1.2 तो विस्तार पात्रों के व्यवहार का वर्णन करने पर चला जाता है।
  • किसी भी अतिरिक्त सदस्यों की उपस्थिति, अर्थ, और प्रतिनिधित्व लोकेल-विशिष्ट है।
संबंधित मुद्दे