2010-06-08 13 views
17

विंडोज _setmbcp समारोह किसी भी मान्य कोड पेज की अनुमति देता है ...यूटीएफ -8 को "एएनएसआई" कोड पृष्ठ के रूप में क्यों अनुमति नहीं दी गई है?

ठीक है, का समर्थन नहीं UTF-7 बनाता है (UTF-7 और UTF-8, जो समर्थित नहीं हैं को छोड़कर) भावना: अक्षरों में अनूठे प्रतिनिधित्व होते हैं और जटिलता और सुरक्षा जोखिम प्रस्तुत करते हैं।

लेकिन यूटीएफ -8 क्यों नहीं?

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

+3

क्या आप जानते थे कि CP65001 यूटीएफ -8 के लिए विंडोज़ का नाम है? यह अच्छी तरह से प्रलेखित नहीं है लेकिन आप इसे आश्चर्यजनक संख्या में स्थानों में उपयोग कर सकते हैं हालांकि उदाहरण के लिए कुछ लिखें 'WriteFile()' में। – hippietrail

उत्तर

9

"एएनएसआई" कोडपेज मूल रूप से विरासत है: विंडोज 9एक्स युग। सभी आधुनिक सॉफ्टवेयर यूनिकोड (यानी, यूटीएफ -16) वैसे भी आधारित होना चाहिए।

असल में, जब अंसी कोड पेज सामान मूल रूप से डिज़ाइन किया गया था, तो यूटीएफ -8 का आविष्कार भी नहीं किया गया था और बहु-बाइट एन्कोडिंग के लिए समर्थन इतना खतरनाक था (यानी अधिकांश Ansi कोड पेज एकल बाइट हैं, कुछ के अपवाद के साथ पूर्वी एशियाई कोड पेज जो एक या दो बाइट हैं)। "उचित" बहु-बाइट एन्कोडिंग के लिए समर्थन जोड़ना संभवतः प्रयास के लायक नहीं माना गया था जब भी यूटीएफ -16 में सभी नए विकास किए जाने चाहिए।

+15

मैं मानता हूं कि सभी नए विकास * यूनिकोड * में होना चाहिए। लेकिन मेरे पास यूटीएफ -16 के बजाय यूटीएफ -8 का उपयोग करने का प्रस्ताव था। (1) मेरी टीम ने किसी भी गैर-यूनिकोड-जागरूक कोड की दस लाख लाइनें लिखीं, इससे पहले कि किसी ने इसके बारे में कोई डर दिया हो, और अब यह उन सभी चार-आधारित तारों को wchar_t- आधारित लोगों में बदलने का एक बड़ा प्रयास होगा। (2) हमारे पास लिनक्स में हमारे उत्पाद को पोर्ट करने की योजना है, जिस पर यूटीएफ -8 को प्राथमिकता दी जाती है। – dan04

5

_setmbcp() एक वीसी ++ आरटीएल फ़ंक्शन है, Win32 API फ़ंक्शन नहीं। यह केवल प्रभावित करता है कि आरटीएल तारों की व्याख्या कैसे करता है। इसका Win32 API A फ़ंक्शंस पर कोई प्रभाव नहीं पड़ता है। जब वे आंतरिक रूप से W समकक्षों को कॉल करते हैं, तो A फ़ंक्शंस हमेशा MultiByteToWideChar() और WideCharToMultiByte() का उपयोग कोडपृष्ठ 0 (CP_ACP) को निर्दिष्ट करने के लिए सिस्टम डिफ़ॉल्ट Ansi codepage का उपयोग करने के लिए करते हैं।

+0

क्या माइक्रोसॉफ्ट इसे कहीं भी स्पष्ट रूप से बताता है? यदि वे वास्तव में ऐसा करते हैं तो मुझे कोई कारण नहीं दिखता कि एएनएसआई फ़ंक्शन का उपयोग करते समय CP_UTF8 का उपयोग करने के लिए रनटाइम को किसी भी तरह से क्यों नहीं बताया जाना चाहिए। – Calmarius

3

माइक्रोसॉफ्ट के अंतर्राष्ट्रीयकरण विशेषज्ञ माइकल कपलन ने इस on his blog का उत्तर देने का प्रयास किया।

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

+0

एएनएसआई कोड पेज विंडोज़ में दो बाइट तक सीमित नहीं हैं। चार की प्रगति एसबीसीएस-> डीबीसीएस-> एमबीसीएस थी और wchar_t के लिए यूसीएस 2-> यूटीएफ 16 थी। मुझे एमबीसीएस के लिए यूटीएफ 8 कोड पेज और चार के साथ काम नहीं करने का कोई अच्छा कारण नहीं दिखता है। – evoskuil

+0

@evoskuil विंडोज द्वारा समर्थित एएनएसआई कोड पेज का एक उदाहरण क्या है जो प्रति कोड बिंदु से दो बाइट्स का उपयोग करता है? AFAIK, विंडोज़ के लिए, एमबीसीएस का अर्थ है डीबीसीएस (और डीबीसीएस का अर्थ 1- या 2-बाइट वर्ण), और http://msdn.microsoft.com/en-us/library/cwe8bzh0.aspx स्पष्ट रूप से पुष्टि करता है। – jamesdlin

+1

देखें [कोड पेज पहचानकर्ता] (http: // msdn।microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).asp) मैंने ऊपर पोस्ट किया: विंडोज एक्सपी और बाद में: जीबी 18030 सरलीकृत चीनी (4 बाइट) आपके द्वारा पोस्ट किए गए संदर्भ : "सभी प्लेटफॉर्म पर डबल-बाइट कैरेक्टर सेट (डीबीसीएस) नामक मल्टीबाइट कैरेक्टर सेट (एमबीसीएस) के एक रूप के लिए समर्थन।" आईओबी डीबीसीएस नामक फॉर्म एमबीसीएस का सबसेट है। यह "सभी प्लेटफॉर्म" के लिए है। पृष्ठ पर और नीचे देखें: "विंडोज ऑपरेटिंग सिस्टम के एमबीसीएस-सक्षम संस्करण पर चलने पर [उपकरण] पूरी तरह से एमबीसीएस-सक्षम हैं।" – evoskuil

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