2008-10-05 11 views
32

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

उत्तर

76

बाहर चेक योएल Spolsky के The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

संपादित 20,140,523: इसके अलावा, यूट्यूब पर टॉम स्कॉट द्वारा Characters, Symbols and the Unicode Miracle देखना - यह सिर्फ के तहत दस मिनट है, और प्रतिभाशाली का एक अद्भुत विवरण 'हैक' है कि यूटीएफ -8

+1

हेहे, जब मैंने शीर्षक पढ़ा तो यह बिल्कुल सही लेख था जो मेरे दिमाग में आया था। – VVS

+0

मैंने इसे पहले नहीं पढ़ा था ... अन्य तरीकों के माध्यम से मेरा i18n प्रशिक्षण मिला। एक हानिकारक और विशाल शैक्षिक लेख के लिए लिंक – Akrikos

+2

+1 के लिए धन्यवाद। –

25

एक वर्ण एन्कोडिंग में कोड के अनुक्रम होते हैं जो प्रत्येक किसी दिए गए चरित्र सेट से प्रतीक को देखते हैं। कृपया Wikipedia on character encoding पर यह अच्छा लेख देखें।

UTF8 (UCS) प्रत्येक प्रतीक के लिए 1 से 4 बाइट का उपयोग करता है।

  • एक एकल-बाइट वर्ण का सबसे महत्वपूर्ण बिट हमेशा 0.
  • एक बहु की पहली बाइट के सबसे महत्वपूर्ण बिट है: Wikipedia कैसे मल्टी-बाइट खड़ा होनेवाला काम करता है की एक अच्छी ठहरनेवाला देता है -byte अनुक्रम अनुक्रम की लंबाई निर्धारित करें। दो सबसे बाइट अनुक्रमों के लिए ये सबसे महत्वपूर्ण बिट्स 110 हैं; तीन-बाइट अनुक्रमों के लिए 1110, और इसी तरह।
  • बहु-बाइट अनुक्रम में शेष बाइट्स में 10 सबसे अधिक महत्वपूर्ण बिट्स हैं।
  • एक यूटीएफ -8 स्ट्रीम में न तो बाइट एफई और न ही एफएफ शामिल है। यह सुनिश्चित करें कि एक UTF-8 धारा कभी नहीं एक UTF-16 धारा U + FEFF (बाइट क्रम के निशान) के साथ शुरू

पृष्ठ आपको यह भी फायदे के बीच एक महान तुलना से पता चलता तरह लग रहा है बनाता है और प्रत्येक चरित्र एन्कोडिंग प्रकार के नुकसान।

UTF16 (UCS2)

प्रत्येक प्रतीक के लिए 4 बाइट के लिए 2 बाइट्स का उपयोग करता है।

UTF32 (UCS4)

प्रत्येक प्रतीक के लिए हमेशा 4 बाइट का उपयोग करता है।

char का मतलब केवल डेटा का बाइट है और वास्तविक एन्कोडिंग नहीं है। यह यूटीएफ 8/यूटीएफ 16/एएससीआई के समान नहीं है। एक char * सूचक किसी भी प्रकार के डेटा और किसी भी एन्कोडिंग का संदर्भ ले सकता है।

एसटीएल:

दोनों एसटीएल के std :: wstring और std :: स्ट्रिंग UTF-8 और UTF-16 की तरह चर लंबाई वर्ण एन्कोडिंग के लिए नहीं बनाया गया है।

लागू करना सीखें:

iconv पुस्तकालय पर एक नजर डालें।

+2

ब्रायन, यह गलत है। यूटीएफ -16 2 से 4 बाइट्स का उपयोग करता है। केवल यूटीएफ -32 में बाइट्स की निश्चित चौड़ाई है (= 4)। अधिकांश यूटीएफ -16 कार्यान्वयन बस बीएमपी से आगे नहीं बढ़ते हैं और इस प्रकार केवल सीमित चरित्र सेट का समर्थन करते हैं। –

+0

धन्यवाद Konrad, मैंने अपना विवरण अपडेट किया। –

+0

व्यक्तिगत रूप से, मैं एक बग होने के लिए यूटीएफ 16 डेटा को इंगित करने के लिए एक char * का उपयोग करने पर विचार करता हूं। –

4

विभिन्न यूटीएफ मानकों "कोड बिंदु" को एन्कोड करने के तरीके हैं। एक कोडपॉइंट यूनिकोड चार्टेटर सेट में सूचकांक है।

एक और एन्कोडिंग यूसीएस 2 है जो हमेशा 16 बिट है, और इस प्रकार पूर्ण यूनिकोड रेंज का समर्थन नहीं करता है।

जानना अच्छा है कि एक कोडपॉइंट एक वर्ण के बराबर नहीं है। उदाहरण के लिए å जैसे चरित्र को कोड बिंदु के रूप में या दो कोड बिंदुओं के रूप में दोनों को अंगूठी के लिए एक के रूप में दर्शाया जा सकता है।

दो यूनिकोड स्ट्रिंग की तुलना में तुलना करने से पहले कैननिकल प्रतिनिधित्व प्राप्त करने के लिए सामान्यीकरण की आवश्यकता होती है।

1

फोंट के साथ भी समस्या है। फोंट को संभालने के दो तरीके हैं। या तो आप आवश्यक सभी यूनिकोड वर्णों के लिए ग्लाइफ के साथ एक विशाल फ़ॉन्ट का उपयोग करें (मुझे लगता है कि विंडोज के हाल के संस्करण एक या दो ऐसे फोंट के साथ आता है)। या आप यूनिकोड मानक के सबसेट्स को समर्पित विभिन्न फ़ॉन्ट्स से ग्लाइफ को संयोजित करने में सक्षम कुछ लाइब्रेरी का उपयोग करते हैं।

12

Received wisdom बताता है कि स्पॉल्स्की का लेख कुछ महत्वपूर्ण बिंदुओं को याद करता है।

यह लेख और पूरी होने के रूप में सिफारिश की है: Unicode Basics

विशेष रूप से बाद के वर्ण एन्कोडिंग रूपों और यूनिकोड के लिए योजनाओं के एक सिंहावलोकन देता है: The Unicode® Standard: A Technical Introduction

यह लेख भी एक अच्छा परिचय है।

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