2008-10-03 20 views
23

मैं सी विंडोज प्रोग्राम में कोड पेज को यूटीएफ -8 में कैसे सेट करूं?विंडोज़ में यूटीएफ -8

मेरे पास एक तृतीय पक्ष लाइब्रेरी है जो फ़ाइलों को खोलने के लिए फॉपेन का उपयोग करती है। मैं अपने यूनिकोड फ़ाइल नामों को वर्तमान कोड पेज में बदलने के लिए wcstombs का उपयोग कर सकता हूं, हालांकि यदि उपयोगकर्ता के पास कोड पेज के बाहर किसी वर्ण के साथ फ़ाइल नाम है तो यह तोड़ता है।

आदर्श रूप से मैं कोड पेज को यूटीएफ -8 पर सेट करने के लिए _setmbcp (65001) को कॉल करता हूं, हालांकि _setmbcp के लिए एमएसडीएन दस्तावेज बताता है कि यूटीएफ -8 समर्थित नहीं है।

मैं इसके आसपास कैसे हो सकता हूं?

उत्तर

25

दुर्भाग्य से, विंडोज़ में यूनिकोड को वर्तमान कोडपेज बनाने का कोई तरीका नहीं है। CP_UTF7 और CP_UTF8 स्थिरांक छद्म-कोडपेज हैं, जिनका उपयोग केवल MultiByteToWideChar और WideCharToMultiByte रूपांतरण कार्यों में किया गया है, जैसे बेन ने उल्लेख किया था।

आपकी समस्या fstream C++ कक्षाओं के समान है। Fstream रचनाकार केवल char* नाम स्वीकार करते हैं, जो एक वास्तविक यूनिकोड नाम के साथ फ़ाइल खोलना असंभव बनाते हैं। वीसी द्वारा पेश किया जाने वाला एकमात्र समाधान एक हैक था: फ़ाइल को अलग से खोलें और फिर हैंडल को स्ट्रीम ऑब्जेक्ट पर सेट करें। मुझे डर है कि यह आपके लिए एक विकल्प नहीं है, ज़ाहिर है, क्योंकि तीसरी पार्टी लाइब्रेरी शायद हैंडल स्वीकार नहीं करती है।

एकमात्र समाधान जो मैं सोच सकता हूं वह गैर-यूनिकोड नाम के साथ एक अस्थायी फ़ाइल बनाना है, जो मूल से हार्ड-लिंक है, और इसे पैरामीटर के रूप में उपयोग करें।

10

सभी विंडोज एपीआई यूटीएफ -16 में सोचते हैं, तो आप अपनी लाइब्रेरी के चारों ओर एक रैपर लिखने से बेहतर हैं जो सीमाओं में परिवर्तित हो जाता है।

अजीब तरह से पर्याप्त, विंडोज सोचता है कि UTF-8 रूपांतरण के प्रयोजनों के लिए एक कोड पृष्ठ पर है, तो आप codepages के बीच परिवर्तित करने के लिए, जैसे आप एक ही एपीआई का उपयोग करें:

std::wstring Utf8ToUtf16(const char* u8string) 
{ 
    int wcharcount = strlen(u8string); 
    wchar_t *tempWstr = new wchar_t[wcharcount]; 
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount); 
    wstring w(tempWstr); 
    delete [] tempWstr; 
    return w; 
} 

और समान रूप से कुछ वापस कन्वर्ट करने के लिए ।

-4

साइगविन (जो डिफ़ॉल्ट रूप से यूटीएफ -8 लोकेल प्रदान करता है) का उपयोग करें, या विंडोज के लिए अपना खुद का libc हैक लिखें जो यूटीएफ -16 अनुवादों के लिए आवश्यक यूटीएफ -8 करता है और गैर मानक _wfopen आदि कार्यों को लपेटता है।

+2

वास्तव में? क्या आप इसका सुझाव देने जा रहे हैं? –

संबंधित मुद्दे