2011-10-23 10 views
12

मैंने यहां और अन्य जगहों पर कई अन्य पोस्ट देखे हैं (नीचे देखें), लेकिन मेरे पास अभी भी इस प्रश्न का स्पष्ट उत्तर नहीं है: विंडोज़ wchar_t बुनियादी बहुभाषी विमान के बाहर यूनिकोड वर्णों को कैसे संभालता है?विंडोज़ wchar_t बुनियादी बहुभाषी विमान के बाहर यूनिकोड वर्णों को कैसे संभालता है?

यही कारण है:

तो जब आप विंडोज़ पर कुछ (यू + 2008 ए) हान चरित्र को कोड करना चाहते हैं तो विंडोज क्या करता है?

+1

विंडोज यूसीएस 2 को एन्कोडिंग के रूप में उपयोग करता है। –

+1

यही मैंने सोचा था। हालांकि, मैंने अपने विंडोज कंप्यूटर पर एक फ़ाइल नाम सफलतापूर्वक संपादित किया है जिसमें एक (यू + 1 डी 565) मैथैमेटिकल डबेल-स्ट्राइक लघु टी शामिल है। (Http://programmers.stackexchange.com/questions/102205/should-utf-16-be देखें -considered-हानिकारक)। तो स्पष्ट रूप से, भले ही विंडोज यूसीएस -2 का उपयोग कर रहा हो, फिर भी यह मुझे एक फ़ाइल नाम में एक एसएमपी चरित्र डालने की अनुमति देता है। तो यह कैसे करता है? – vy32

+1

[विकिपीडिया] (http://en.wikipedia.org/wiki/NTFS#Internals) के अनुसार, "एनटीएफएस नाम एन्कोडिंग (फ़ाइल नाम, स्ट्रीम नाम, इंडेक्स नाम इत्यादि) के लिए 16-बिट मानों के अनुक्रम की अनुमति देता है। इसका मतलब है कि यूटीएफ -16 कोडपॉइंट्स समर्थित हैं, लेकिन फ़ाइल सिस्टम यह जांच नहीं करता है कि अनुक्रम वैध यूटीएफ -16 है (यह शॉर्ट वैल्यू के किसी अनुक्रम की अनुमति देता है, जो यूनिकोड मानक में प्रतिबंधित नहीं है) "। –

उत्तर

16

विंडोज स्टडीलिब के तहत wchar_t का कार्यान्वयन यूटीएफ -16-अनजान है: यह केवल 16-बिट कोड इकाइयों को जानता है।

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

विंडोज़ की उच्चतर स्तर की विशेषताएं यूटीएफ -16 सरोगेट्स से बने पात्रों का समर्थन करती हैं, यही कारण है कि आप .txt फ़ाइल को कॉल कर सकते हैं और इसे दोनों सही ढंग से प्रस्तुत कर सकते हैं और सही ढंग से संपादित कर सकते हैं (एक सिंगल कीप्रेस लेना, दो नहीं , चरित्र के पीछे जाने के लिए) एक्सप्लोरर जैसे प्रोग्रामों में जटिल टेक्स्ट लेआउट का समर्थन करते हैं (आमतौर पर विंडोज की यूनिस्क्रिप्ट लाइब्रेरी का उपयोग करते हुए)।

लेकिन वहां अभी भी कर रहे हैं देता है जहां इस तरह के तथ्य आप एक फ़ाइल .txt, जहां केस-असंवेदनशीलता अन्यथा यह नामंज़ूर के रूप में एक ही फ़ोल्डर में .txt कहा जाता है बना सकते हैं के रूप में UTF-16-भुलक्कड़ी के माध्यम से चमक रहा है देख सकते हैं, या तथ्य यह है कि आप [U+DC01][U+D801].txt प्रोग्रामेटिक रूप से बना सकते हैं।

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

+2

+1 "समर्थन" के लिए +1। सबसे पहले अपने नामकरण को परिभाषित करें, फिर तर्क दें। :) –

+0

उन '.txt'-s क्रोम में मेरे लिए एक ही हैं (एक"? "), जिसका इरादा नहीं है, है ना? ;) – mlvljr

7

विंडोज यूसीएस -2 का उपयोग करने के लिए उपयोग किया जाता है लेकिन विंडोज 2000 के साथ यूटीएफ -16 अपनाया जाता है। विंडोज wchar_t एपीआई अब यूटीएफ -16 का उत्पादन और उपभोग करते हैं।

सभी तीसरे पक्ष के कार्यक्रम इस सही तरीके से संभाल नहीं पाते हैं और इसलिए बीएमपी के बाहर डेटा के साथ छोटी हो सकती है।

यह भी ध्यान दें कि यूटीएफ -16, एक परिवर्तनीय लंबाई एन्कोडिंग होने के नाते, wchar_t के साथ उपयोग किए गए एन्कोडिंग के लिए सी या सी ++ आवश्यकताओं के अनुरूप नहीं है। इससे कुछ मानक फ़ंक्शंस जैसे कुछ मानक फ़ंक्शंस होते हैं, जो एक wchar_t लेते हैं, जैसे कि wctomb, विंडोज पर बीएमपी से परे वर्णों को संभाल नहीं सकता है, और विंडोज़ कुछ अतिरिक्त कार्यों को परिभाषित करता है जो एकल वर्णों को संभालने में सक्षम होने के लिए व्यापक प्रकार का उपयोग करते हैं बीएमपी के बाहर। मैं भूल गया कि यह क्या काम था, लेकिन मैं एक विंडोज़ फ़ंक्शन में भाग गया जो wchar_t के बजाय int लौटा (और यह वह नहीं था जहां ईओएफ एक संभावित परिणाम था)।

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