लघु जवाब:
कोई रूपांतरण करता है, तो आप इस तरह के cstring या wstring के रूप में यूनिकोड तार का उपयोग की आवश्यकता है। Sqlite3_open16() का प्रयोग करें। आपको यह सुनिश्चित करना होगा कि आप एक डब्ल्यूसीएचएआर पॉइंटर पास करें (void *
पर डाला गया। लंगड़ा लगता है! भले ही यह lib क्रॉस प्लेटफार्म है, मुझे लगता है कि वे एक विस्तृत चार प्रकार को परिभाषित कर सकते हैं जो मंच पर निर्भर करता है और void *
से कम असभ्य है) एपीआई के लिए। एक cstring के लिए के रूप में इस तरह के: (void*)(LPCWSTR)strFilename
लंबा उत्तर:
आप एक यूनिकोड स्ट्रिंग है कि आप UTF8 या UTF16 को परिवर्तित करना चाहते हैं नहीं है। आपके पास दिए गए एन्कोडिंग का उपयोग करके आपके प्रोग्राम में एक यूनिकोड स्ट्रिंग का प्रतिनिधित्व किया गया है: यूनिकोड प्रति बाइनरी प्रतिनिधित्व नहीं है। एन्कोडिंग्स का कहना है कि कैसे यूनिकोड कोड पॉइंट्स (संख्यात्मक मान) स्मृति में प्रदर्शित होते हैं (संख्या का बाइनरी लेआउट)। यूटीएफ 8 और यूटीएफ 16 सबसे व्यापक रूप से उपयोग किए जाने वाले एन्कोडिंग हैं। हालांकि वे बहुत अलग हैं।
जब एक वीएस प्रोजेक्ट "यूनिकोड वर्णसेट" कहता है, तो इसका वास्तव में अर्थ है "वर्ण यूटीएफ 16 के रूप में एन्कोड किए गए हैं"। इसलिए, आप सीधे sqlite3_open16() का उपयोग कर सकते हैं। कोई रूपांतरण आवश्यक नहीं है। अक्षरों को WCHAR प्रकार में संग्रहीत किया जाता है (char
के विपरीत) जो 16 बिट्स (मानक सी प्रकार wchar_t
पर फॉल्सबैक लेता है, जो Win32 पर 16 बिट्स लेता है। अन्य प्लेटफार्मों पर अलग हो सकता है। सुधार के लिए धन्यवाद, चेकर्स)।
एक और विवरण है कि आप इस पर ध्यान देना चाहेंगे: यूटीएफ 16 2 स्वादों में मौजूद है: बिग एंडियन और लिटिल एंडियन। यह 16 बिट्स का बाइट ऑर्डरिंग है। यूटीएफ 16 के लिए आप जो फ़ंक्शन प्रोटोटाइप देते हैं वह यह नहीं कहता कि किस ऑर्डरिंग का उपयोग किया जाता है। लेकिन आप यह मानते हुए बहुत सुरक्षित हैं कि स्क्लाइट विंडोज के रूप में एक ही एंडियन-नेस का उपयोग करता है (लिटिल एंडियन आईआईआरसी। मुझे ऑर्डर पता है लेकिन हमेशा नामों में समस्या है :-))। चेकर्स द्वारा टिप्पणी करने के लिए उत्तर::
संपादित
UTF16 16 बिट कोड इकाइयों उपयोग करता है। Win32 के तहत Win32 (और केवल) के तहत, wchar_t
ऐसी स्टोरेज इकाई के लिए उपयोग किया जाता है। चाल यह है कि कुछ यूनिकोड वर्णों को 2 ऐसे 16-बिट कोड इकाइयों के अनुक्रम की आवश्यकता होती है। उन्हें सरोगेट जोड़े कहा जाता है।
वैसे ही एक यूटीएफ 8 1 से 4 बाइट अनुक्रम का उपयोग करके 1 वर्ण का प्रतिनिधित्व करता है। फिर भी यूटीएफ 8 का उपयोग char
प्रकार के साथ किया जाता है।
स्रोत
2008-11-11 09:38:31
नहीं, नहीं, नहीं! sqlite3_open16() 'शून्य *' तर्क का उपयोग करता है, क्योंकि इसे यूटीएफ 16, * नहीं * wchar_t कहा जाता है, जो अलग-अलग प्लेटफॉर्म पर अलग-अलग आकार का होता है और हो सकता है कि यूटीएफ 16 (यानी glibc में 4-बाइट wchar_t) हो या हो। –
चेकर्स: –
से ऊपर संपादित करें के रूप में मेरा उत्तर देखें हाँ, मुझे यूटीएफ 16 प्रतिनिधित्व के बारे में पता है। लेकिन, आप यह नहीं मान सकते कि wchar_t का आंतरिक प्रतिनिधित्व सभी प्लेटफॉर्म पर समान है, यह नहीं है। –