2012-01-12 19 views
18

क्या यूटीएफ -8 तारों के साथ विंडोज एपीआई एएनएसआई फ़ंक्शंस का उपयोग करना संभव है?विंडोज एपीआई एएनएसआई फ़ंक्शंस और यूटीएफ -8

उदाहरण के लिए, मेरे पास यूटीएफ -8 में एन्कोडेड पथ है। क्या मैं CreateDirectoryA या CreateFileA पर कॉल कर सकता हूं और यूटीएफ -8 पथ का उपयोग कर सकता हूं, या क्या मुझे कार्यों को कॉल करने से पहले कुछ रूपांतरण करना है?

+2

ओह। कोई भी ऐसा क्यों चाहेंगे? मुझे लगता है कि हम अब विंडोज एमई के पीछे हैं (जो एएनएसआई एपीआई की आवश्यकता के लिए आखिरी विंडोज संस्करण था)। उन्हें पहले से ही मर जाना चाहिए, खासकर नव विकसित अनुप्रयोगों के लिए। – Joey

+1

आप यूटीएफ -8 स्ट्रिंग कहां से प्राप्त कर रहे हैं? यूटीएफ -16 स्ट्रिंग्स के साथ पूरी तरह से काम करने के लिए अपने एप्लिकेशन को कन्वर्ट करना बहुत आसान है, क्योंकि तथाकथित व्यापक संस्करण विंडोज एपीआई फ़ंक्शंस की आवश्यकता होती है। और जैसा कि जॉय कहते हैं, * हमेशा * विस्तृत संस्करणों को कॉल करें ('डब्ल्यू' प्रत्यय के साथ), एएनएसआई संस्करण नहीं। वे दशकों से अप्रचलित रहे हैं। –

+4

@ जॉय: क्योंकि सी (++) पुस्तकालयों (मानक लाइब्रेरी समेत) का एक भयानक बहुत कुछ 'wchar_t'- आधारित तारों की बजाय' char'- आधारित तारों के साथ काम करना पसंद करता है। यदि विंडोज पूरी तरह से यूटीएफ -8 का समर्थन करता है, तो आप यूटीएफ -8 और यूटीएफ -16 के बीच हर समय कनवर्ट करने के बजाय अपने कार्यक्रम में यूटीएफ -8 का उपयोग कर सकते हैं। – dan04

उत्तर

15

नहीं। यूटीएफ -8 को यूटीएफ -16 में परिवर्तित करने के लिए MultiByteToWideChar का उपयोग करें और फिर विस्तृत वर्ण एपीआई जैसे CreateDirectoryW या CreateFileW पर कॉल करें।

+0

अरे, मैं उससे डरता था .. :(गह .. उस पर बेहतर शुरुआत करें .. – krebstar

+12

मैं यह भी जोड़ूंगा कि चूंकि विंडोज यूटीएफ -16 का विशेष रूप से उपयोग करता है, तो यह आपके लिए सूट का पालन करना और यूटीएफ के साथ काम करना सबसे अच्छा हो सकता है -16 अधिकांश भाग के लिए, और केवल यूटीएफ -8 में रूपांतरण करते हैं जब आपको बाहरी स्रोतों से पढ़ने/लिखने की आवश्यकता होती है। – casablanca

+4

@ कैसाब्लांका: वकालत का एक अन्य दृष्टिकोण है जो अधिकांश भाग के लिए यूटीएफ -8 का उपयोग करना और परिवर्तित करना है और यूटीएफ -16 से केवल विंडोज इंटरफ़ेस से बात करते समय। –

3

एक आसान दृष्टिकोण (कच्चे Win32 एपीआई MultiByteToWideChar का उपयोग करने से) ATL conversion helpers उपयोग करने के लिए, CA2CW जैसा होगा। आप कोड पेज (निर्माता में दूसरा पैरामीटर) के रूप में CP_UTF8 निर्दिष्ट कर सकते हैं, यूनिकोड से UTF-8 यूनिकोड UTF-16 में बदलने के लिए: यूनिकोड में बनाता है कि

CreateDirectoryW( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 

नोट (डिफ़ॉल्ट लोगों होना चाहिए जो इन दिन), CreateDirectory सिर्फ CreateDirectoryW के लिए विस्तारित, तो मैं बस खत्म होने वाली "डब्ल्यू" ड्रॉप और (IMHO, अधिक पठनीय) CreateDirectory का प्रयोग करेंगे:

CreateDirectory( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 
संबंधित मुद्दे