खोज…


परिचय

तर्क के रूप में एक या अधिक स्ट्रिंग लेने वाले कार्यों के लिए विंडोज एपीआई प्रलेखन आमतौर पर इस तरह दिखेगा:

BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

दो स्ट्रिंग मापदंडों के लिए डेटाटाइप कई भागों से बना है:

  • एलपी = लंबे सूचक
  • सी = कास्ट
  • T = TCHAR
  • एसटीआर = स्ट्रिंग

अब TCHAR क्या मतलब है? यह कार्यक्रम के संकलन के लिए चुने गए मंच पर निर्भर करता है।

CopyFile ही एक मैक्रो है, इसे कुछ इस तरह से परिभाषित किया गया है:

#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif

तो वास्तव में दो CopyFile फ़ंक्शन हैं और संकलक झंडे के आधार पर, CopyFile मैक्रो एक या दूसरे को हल करेगा।

वहाँ कोर टोकन, TCHAR के रूप में परिभाषित किया गया है:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

इसलिए फिर से, संकलित झंडे के आधार पर, TCHAR एक "संकीर्ण" या "चौड़ा" (2 बाइट्स) वर्ण है।

तो जब यूनिकोड परिभाषित किया गया है, CopyFile होने के लिए परिभाषित किया गया है CopyFileW , जो उनके पैरामीटर, जो UTF-16 इनकोडिंग होने की उम्मीद है के रूप में 2-बाइट वर्ण सरणियों का उपयोग करेगा।

यूनिकोड से परिभाषित नहीं है, तो CopyFile होने के लिए परिभाषित किया गया है CopyFileA जो एकल-बाइट चरित्र सरणियों जो वर्तमान उपयोगकर्ता के डिफ़ॉल्ट एएनएसआई एन्कोडिंग में एन्कोड करने की उम्मीद कर रहे हैं का उपयोग करता है।

दो समान मैक्रोज़ हैं: UNICODE , Windows API को विस्तृत स्ट्रिंग्स और _UNICODE (एक अग्रणी अंडरस्कोर के साथ) की उम्मीद करता है जो C रनटाइम लाइब्रेरी में समान सुविधाओं को सक्षम करता है।

ये परिभाषित हमें ANSI और यूनिकोड-मोड में संकलित कोड लिखने की अनुमति देते हैं।

यह जानना महत्वपूर्ण है कि ANSI एन्कोडिंग एक सिंगल-बाइट एन्कोडिंग (यानी लैटिन -1) एक मल्टी-बाइट एन्कोडिंग (यानी शिफ्ट जिस) हो सकती है, हालांकि utf-8 है, दुर्भाग्य से, अच्छी तरह से समर्थित नहीं है।

इसका मतलब है कि न तो एएनएसआई, न ही इन कार्यों के वाइड-कैरेक्टर वेरिएंट को निश्चित चौड़ाई के एन्कोडिंग के साथ काम करने के लिए माना जा सकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow