अधिकांश WinAPI कॉल में Unicode और ANSI फ़ंक्शन कॉल है

उदाहरण के लिए:

function MessageBoxA(hWnd: HWND; lpText, lpCaption: LPCSTR; uType: UINT): Integer; stdcall;external user32;

function MessageBoxW(hWnd: HWND; lpText, lpCaption: LPCWSTR; uType: UINT): Integer; stdcall; external user32;

मुझे यूनिकोड फ़ंक्शन को कॉल करने के बजाय ANSI फ़ंक्शन का उपयोग कब करना चाहिए?

3
RepeatUntil 15 नवम्बर 2015, 02:22

2 जवाब

सबसे बढ़िया उत्तर

इसका पालन करने का सबसे सरल नियम यह है: केवल उन सिस्टम पर एएनएसआई वेरिएंट का उपयोग करें जिनमें यूनिकोड संस्करण नहीं है। यह विंडोज 95, 98 और एमई पर है, जो विंडोज के संस्करण हैं जो यूनिकोड का समर्थन नहीं करते हैं।

इन दिनों, यह असाधारण संभावना नहीं है कि आप ऐसे संस्करणों को लक्षित करेंगे, और इसलिए सभी संभावना में आपको हमेशा यूनिकस वेरिएंट का उपयोग करना चाहिए।

4
Remy Lebeau 26 पद 2019, 01:25

बस (दुर्लभ) पोस्ट की गई टिप्पणियों / उत्तरों के अपवाद के रूप में ...

उन मामलों में ANSI कॉल का उपयोग करने का विकल्प चुन सकते हैं जहां UTF-8 अपेक्षित और समर्थित है। एक उदाहरण के लिए, एक कंसोल फ़ॉन्ट में TTC फॉन्ट और chcp 65001 के तहत चलने के लिए सेट कंसोल-राइटिंग UTF-8 तार लिखें।

एक अन्य विषम अपवाद वह कार्य है जो मुख्य रूप से एएनएसआई के रूप में लागू किया जाता है, जहां यूनिकोड "डब्ल्यू" संस्करण केवल सक्रिय कोडपेज में एक संकीर्ण स्ट्रिंग में परिवर्तित होता है और "ए" समकक्ष को कॉल करता है। इस तरह के एक फ़ंक्शन के लिए, और जब एक संकीर्ण स्ट्रिंग उपलब्ध होती है, तो "ए" संस्करण को सीधे कॉल करना एक निरर्थक दोहरे रूपांतरण को बचाता है। पॉइंट इन पॉइंट आउटपुटबीडगस्ट्रिंग है, जो विंडोज 10 तक इस श्रेणी में आता है (मैंने अभी देखा https://msdn.microsoft.com/en-us/library/windows/desktop/aa363362.aspx जिसका उल्लेख है कि WaitForDebugEventEx के लिए एक कॉल - केवल विंडोज़ 10 पर उपलब्ध है - आउटपुटडबगस्ट्रिंग के लिए सही यूनिकोड आउटपुट सक्षम करता है। )।

फिर एपीआई होते हैं, जो स्ट्रिंग्स से निपटने के बावजूद, मूल रूप से एएनएसआई हैं। उदाहरण के लिए GetProcAddress केवल ANSI संस्करण में मौजूद है जो LPCSTR तर्क लेता है, क्योंकि निर्यात तालिकाओं में नाम संकीर्ण तार हैं।

एक बड़े स्ट्रिंग-संबंधित एपीआई द्वारा यूनिकोड कहा जाता है और "डब्ल्यू" वेरिएंट का उपयोग करने के लिए प्रोत्साहित किया जाता है। सभी नए API के पास "A" संस्करण भी नहीं है (जैसे CommandLineToArgvW)। घोड़ों के मुंह से https://msdn.microsoft.com/en -US / पुस्तकालय / विंडोज़ / डेस्कटॉप / ff381407.aspx:

विंडोज़ मूल रूप से यूआई तत्वों, फ़ाइल नामों और इसके आगे के लिए यूनिकोड स्ट्रिंग्स का समर्थन करता है। यूनिकोड पसंदीदा चरित्र एन्कोडिंग है, क्योंकि यह सभी वर्ण सेट और भाषाओं का समर्थन करता है। Windows यूटीएफ -16 एन्कोडिंग का उपयोग करके यूनिकोड वर्णों का प्रतिनिधित्व करता है, जिसमें प्रत्येक वर्ण 16-बिट मान के रूप में एन्कोड किया गया है। UTF-16 वर्णों को विस्तृत वर्ण कहा जाता है, उन्हें 8-बिट ANSI वर्णों से अलग करने के लिए।

[...] जब Microsoft ने यूनिकोड समर्थन को विंडोज में पेश किया, तो इसने एपीआई के दो समानांतर सेट प्रदान करके संक्रमण को कम कर दिया, एक एएनएसआई स्ट्रिंग्स के लिए और दूसरा यूनिकोड स्ट्रिंग्स के लिए।

[...] आंतरिक रूप से, ANSI संस्करण स्ट्रिंग को यूनिकोड में अनुवादित करता है। विंडोज हेडर भी एक मैक्रो को परिभाषित करते हैं जो यूनिकोड संस्करण का समाधान करता है जब प्रीप्रोसेसर प्रतीक UNICODE परिभाषित होता है या एएनएसआई संस्करण अन्यथा।

[...] विंडोज के अधिकांश नए एपीआई में सिर्फ यूनिकोड संस्करण होता है, जिसमें कोई भी संबंधित एएनएसआई संस्करण नहीं होता है।

[NOTE] अंतिम दो पैराग्राफ को जोड़ने के लिए पोस्ट को संपादित किया गया था।

8
IInspectable 15 नवम्बर 2015, 17:55