2012-06-28 3 views
8

मैं वर्तमान में एक शौक परियोजना (सी/सी ++) पर काम कर रहा हूं जो कि यूनिकोड के लिए पूर्ण समर्थन के साथ विंडोज और लिनक्स दोनों पर काम करना है। अफसोस की बात है, विंडोज और लिनक्स हमारे जीवन को और अधिक कठिन बनाते हुए विभिन्न एन्कोडिंग का उपयोग करते हैं।सी/सी ++ में क्रॉस-प्लेटफ़ॉर्म यूनिकोड: किस एन्कोडिंग का उपयोग करना है?

मेरी कोड में मैं यह दोनों विंडोज और लिनक्स के लिए आसान बनाने संभव के रूप में सार्वभौमिक रूप में डेटा का उपयोग करने की कोशिश कर रहा हूँ,। विंडोज़ में, wchar_t को डिफ़ॉल्ट रूप से यूटीएफ -16 के रूप में एन्कोड किया गया है, और लिनक्स में यूसीएस -4 के रूप में (अगर मैं गलत हूं तो मुझे सही करें)।

मेरा सॉफ़्टवेयर खुलता है ({_wfopen, UTF-16, Windows}, {fopen, UTF-8, Linux}) और यूटीएफ -8 में फ़ाइलों को डेटा लिखता है। अब तक यह सब करने योग्य है। जब तक मैंने SQLite का उपयोग करने का फैसला नहीं किया।

SQLite का C/C++ इंटरफ़ेस एक या दो-बाइट इनकोडिंग तार (click) के लिए अनुमति देता है। यह लिनक्स में wchar_t के साथ काम नहीं करता है, क्योंकि लिनक्स में wchar_t डिफ़ॉल्ट रूप से 4 बाइट्स है। इसलिए, एसक्लाइट से लिखना और पढ़ना लिनक्स के लिए रूपांतरण की आवश्यकता है।

वर्तमान कोड विंडोज़/लिनक्स के लिए अपवादों के साथ को अव्यवस्थित है। एक समस्या के बिना filepaths, पढ़ने/एक समस्या के बिना SQLite के लिए लिख: Windows में

  • wchar_t: मैं wchar_t में डेटा भंडारण के मानक विचार करने के लिए छड़ी करने की उम्मीद कर रहा था। एक फ़ाइल में डेटा लिखना वैसे भी यूटीएफ -8 में किया जाना चाहिए। लिनक्स में
  • wchar_t: पढ़ने/SQLite के लिए लिख (wchar_t) से पहले UTF-8 एन्कोडिंग, रूपांतरण की वजह से filepaths के लिए अपवाद है, और खिड़कियों के लिए एक ही है जब एक फाइल करने के लिए डेटा लेखन।

पढ़ने के बाद (here) मुझे विश्वास था कि मुझे विंडोज़ में wchar_t से चिपकना चाहिए। लेकिन काम करने के लिए सब कुछ पाने के बाद, समस्या लिनक्स को पोर्टिंग के साथ शुरू हुई।

वर्तमान में मैं इसे सरल चार (यूटीएफ -8) के साथ चिपकाने के लिए सभी को फिर से लिखने की सोच रहा हूं क्योंकि यह विंडोज और लिनक्स दोनों के साथ काम करता है, इस तथ्य को ध्यान में रखते हुए कि मुझे विंडोज़ में प्रत्येक स्ट्रिंग को 'वाइडरहरोमोल्टीबीटा' की आवश्यकता है UTF-8। सरल चार * आधारित स्ट्रिंग का उपयोग लिनक्स/विंडोज के लिए अपवादों की संख्या को बहुत कम कर देगा।

आप पार मंच के लिए यूनिकोड के साथ किसी भी अनुभव है? Wchar_t का उपयोग करने के बजाय यूटीएफ -8 में डेटा संग्रहीत करने के विचार के बारे में कोई विचार?

+0

2byte वर्ण एन्कोडिंग निश्चित रूप से * नहीं * यूटीएफ -16 है।यूटीएफ -16 2 से 4 बाइट्स है, और यूटीएफ -8 1 - 4 बाइट्स है। विंडोज़ 'wchar_t' यूटीएफ -16 नहीं है, यह यूसीएस 2 है। अभ्यास में आपको अंतर दिखाई नहीं दे सकता क्योंकि यूसीएस 2 बीएमपी को कवर करता है, लेकिन यदि कभी भी आपके उपयोगकर्ता निर्णय लेते हैं कि उनके पास ओघम या रन में डेटा होना चाहिए ... – user268396

+1

विंडोज यूटीएफ -16 का उपयोग करते हैं, और यूटीएफ -16 रखने के लिए 'wchar_t' का उपयोग करते हैं डेटा, और विंडोज 2000 के बाद से ऐसा किया है। –

+3

wchar_t कितना उपयोगी है और इसके लिए: http://stackoverflow.com/a/11107667/365496 – bames53

उत्तर

6

सभी प्लेटफार्मों पर UTF-8, जस्ट-इन-समय विंडोज के लिए UTF-16 के लिए रूपांतरण के साथ पार मंच यूनिकोड के लिए एक आम तरीका है।

+0

मैं उस कथन को थोड़ा समायोजित करता हूं और कहता हूं: यूटीएफ -8 से/में समय-समय पर रूपांतरण के साथ सभी प्लेटफार्मों पर मूल एन्कोडिंग। जब भी चरित्र स्ट्रिंग एप्लिकेशन छोड़ती है (उदा। फ़ाइल में लिखना, नेटवर्क सॉकेट पर डेटा भेजना, लाइब्रेरी में इनपुट पास करना आदि)। बेशक, यह सब विशिष्ट परिदृश्य पर निर्भर करता है। – IInspectable

2

हमारा सॉफ़्टवेयर क्रॉस-प्लेटफार्म भी है, और हमें इसी तरह की समस्याओं का सामना करना पड़ा। हमने फैसला किया कि हमारा लक्ष्य कम से कम रूपांतरणों को संभव बनाना है। इसका मतलब है कि हम विंडोज पर wchar_t और यूनिक्स/मैक पर char का उपयोग करते हैं।

हम _T और LPCTSTR और यूनिक्स पर समान का समर्थन करके और सामान्य कार्यों है कि आसानी से std::string और std::wstring के बीच परिवर्तित होने से यह करते हैं। हमारे पास एक सामान्य std::basic_string<TCHAR> (tstring) भी है जो हम ज्यादातर मामलों में उपयोग करते हैं।

अभी तक यह काफी अच्छा काम करता है। मूल रूप से अधिकतर फ़ंक्शन tstring या LPCTSTR लेते हैं और जो उनके पैरामीटर को tstring से परिवर्तित नहीं करते हैं। इसका मतलब है कि ज्यादातर समय हम अपने तारों को परिवर्तित नहीं करते हैं और अधिकांश मानकों से गुजरते हैं।

+2

यह एक संभावित समाधान भी है, लेकिन अभी भी थोड़ा हैकी। इसके अलावा, मेरे पढ़ने से मैंने सीखा है कि मुझे टीसीएचएआर का उपयोग करने से बचना चाहिए क्योंकि इसे यूनिकोड ध्वज के बजाय एमबीसीएस में स्विच करके पुराने सॉफ्टवेयर के साथ पिछड़ा संगतता का समर्थन करने के लिए पेश किया गया था। – ErikKou

+0

@Fozi, मैं उबंटू लिनक्स पर _T का समर्थन कैसे करूं? आपका बहुत बहुत धन्यवाद। – Frank

+0

@ErikKou, यूनिक्स या लिनक्स में विंडोज मैक्रो _T को अनुकरण करने के लिए आपका संभावित समाधान क्या है? धन्यवाद। – Frank

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