2012-10-12 12 views
5

क्या यह लिनक्स पर wchar_t* का उपयोग कर यूटीएफ -16 एन्कोडेड टेक्स्ट को स्टोर करने का कोई अर्थ है? स्पष्ट समस्या यह है कि wchar_t लिनक्स पर चार बाइट्स हैं और यूटीएफ -16 प्रति चरित्र आमतौर पर दो (या कभी-कभी दो समूह) बाइट्स लेता है।wchar_t?

मैं एक तृतीय-पक्ष लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं जो वास्तव में ऐसा करता है और यह बहुत भ्रमित लगता है। ऐसा लगता है कि चीजें गड़बड़ हो गई हैं क्योंकि विंडोज wchar_t पर दो बाइट हैं, लेकिन मैं सिर्फ दो बार जांच करना चाहता हूं क्योंकि यह एक बहुत महंगा वाणिज्यिक पुस्तकालय है और शायद मुझे कुछ समझ में नहीं आ रहा है।

+1

आप ** ** 4-बाइट लंबे चर में एक 2-बाइट लंबा मूल्य स्टोर कर सकते हैं ... –

+0

मुझे लगता है कि आपको इसे पढ़ने और समझने की आवश्यकता है [http://www.joelonsoftware.com/articles /Unicode.html) –

+0

क्या यूटीएफ -16 कोड इकाई का प्रतिनिधित्व करने के लिए 'uint16_t' का उपयोग न करने का कोई कारण नहीं है? –

उत्तर

6

हालांकि यह स्टोर करने के लिए UTF-16 wchar_t में, इस तरह के wchar_t मूल्यों (या तार के रूप में इस्तेमाल उनमें से सरणियों) मानक कार्य करता है जो wchar_t तार करने के लिए wchar_t या संकेत लेने से किसी के साथ उपयोग के लिए उपयुक्त नहीं हैं संभव है। इस प्रकार, "क्या यह समझ में आता है ..." के प्रारंभिक प्रश्न का उत्तर देने के लिए, मैं एक निश्चित संख्या के साथ जवाब दूंगा। पाठ्यक्रम के इस उद्देश्य के लिए आप uint16_t का उपयोग कर सकते हैं, या सी 11 char16_t यदि यह उपलब्ध है, तो मैं किसी भी कारण को देखने में असफल रहा हूं कि बाद में बेहतर क्यों होगा जब तक कि आप इसे संसाधित करने के लिए C11 फ़ंक्शंस का उपयोग नहीं कर रहे हैं (और वे ' टी अभी तक लागू किया प्रतीत होता है)।

3

http://userguide.icu-project.org/strings

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

तो यदि आप आईसीयू का उपयोग करते हैं, तो आप UChar* का उपयोग कर सकते हैं। यदि नहीं, uint16_t संक्रमण को आसान बना देगा यदि आप कभी भी UChar के साथ इंटरऑपरेट करना चाहते हैं।

1

अच्छा, सबसे अच्छा समाधान शायद यूटीएफ -16 के लिए char16_t का उपयोग करना है, क्योंकि यह मानक 16-बिट वर्ण प्रकार है। यह जीसीसी 4.4 के बाद से समर्थित है, इसलिए आपको दिखाई देने वाले अधिकांश लिनक्स सिस्टम पर उपस्थित होना चाहिए।

0

नहीं, यह यूटीएफ -16 को डीकोड करने और इसे wchar_t की एक सरणी में संग्रहीत करने के लिए समझ में आता है। यूटीएफ -16 में सभी यूनिकोड कोड बिंदुओं में बिल्कुल एक 16-बिट शब्द नहीं है, लेकिन वे सभी wchar_t में फिट हैं।

किसी भी मामले में, यूटीएफ -16 किसी और चीज से भी बदतर समझौता है, और इसका कभी भी उपयोग नहीं किया जाना चाहिए। या तो यूटीएफ -8 का उपयोग करें (जो ज्यादातर मामलों में अधिक कुशल है, और अधिक सामान्य रूप से उपयोग किया जाता है), या wchar_t [] का उपयोग करें।

+3

ओपी कहता है "विंडोज़ wchar_t पर दो बाइट्स हैं" इसलिए पूरक कोडपॉइंट फिट नहीं हो सकता है जो बताता है कि "वे सभी wchar_t में फिट हैं" मामला नहीं है। मैं मानता हूं कि यूटीएफ -16 आंतरिक प्रतिनिधित्व के लिए एक खराब विकल्प है - इसमें यूटीएफ -8 (अधिक जटिल पुनरावृत्ति) और यूटीएफ -32 (आकार-ब्लोट) दोनों की डाउनसाइड्स है, लेकिन आईसीयू जैसी चीजों के लिए यह मानक है इसके लिए लाइब्रेरी इंटरऑप केस बना सकते हैं। –

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