यूनिकोड और UTF-8/16/32 के बीच संबंध


1

मुझे UTF-8 और इसके अन्य वेरिएंट के बीच के रिश्ते की समझ नहीं है और टर्मिनल पर विसंगतिपूर्ण परिणाम मिल रहे हैं। उदाहरण के लिए, दाहिना तीर है:

0xE2 0x86 0x92 UTF-8 में

लकिन यह है

0x2192 UTF-16 में UTF-16 और यूनिकोड में

मुझे समझ में नहीं आता है कि E28692 2192 के बराबर कैसे है।

इसके अलावा, यूटीएफ -8 संस्करण मेरे लिनक्स टर्मिनल में काम नहीं कर रहा है, जो यूजेड -8 एन्कोडिंग का उपयोग डीज़ावू फ़ॉन्ट के साथ कर रहा है जो यूनिकोड का समर्थन करता है। उदाहरण के लिए, यदि मैं प्रवेश करता हूं

echo -e "\u2192"

तब मुझे एक तीर मिलता है, महान, सही, यह काम करता है। लेकिन, अगर मैं प्रवेश करता हूं

echo -e "\xe2\x86\x92" या

echo -e "\x00\x00\x21\x92"

फिर मुझे गलत ग्राफिक्स मिलते हैं। मेरे हेक्स अनुक्रम गलत क्यों हैं?


1
आप चारसेट और एन्कोडिंग कि चारसेट के पात्रों एन्कोड करने के लिए भ्रमित कर रहे हैं निरपेक्ष न्यूनतम हर सॉफ्टवेयर डेवलपर बिल्कुल, सकारात्मक यूनिकोड और चरित्र सेट (कोई Excuses बारे में पता होना चाहिए!
phuclv


I don't understand how E28692 is equivalent to 2192.वह कथन अमान्य है। समस्या यह है कि एक दूसरे के बराबर नहीं है , बल्कि एक दूसरे को मैप किया जाता है। दुर्भाग्य से, मैं अभी भी एक नुकसान में हूँ कि क्या किसी प्रकार का फॉर्मूला मैपिंग फ़ंक्शन है, या यदि यह सिर्फ कुछ विशाल लुक-अप टेबल है। जो मैं बता सकता हूं, उसमें से कुछ तर्क प्रतीत होते हैं (हालांकि यह एक अच्छा, आसान नहीं है)।
Synetech

जवाबों:


2

यूनिकोड एक चरित्र सेट है। UTF एनकोडिंग हैं।

यूनिकोड संबंधित कोड बिंदुओं के साथ वर्णों के एक सेट को परिभाषित करता है, अर्थात। ऐसे मान जो कि यूनिकोड वर्ण सेट में अक्षरों की पहचान करने में असमर्थता जताते हैं।

उदाहरण के लिए unicode-table.com के अनुसार U+0041, राजधानी A से मेल खाती है, U+03A3ग्रीक कैपिटल सिग्मा (Σ) है और U+2603एक स्नोमैन (snow) है। U+नंबर कोड बिंदु हैं। यूनिकोड हमें बताता है कि प्रतीक किस कोड बिंदु से मेल खाता है, लेकिन हमें यह नहीं बताता कि उन कोड बिंदुओं को बाइट्स में कैसे एनकोड किया जाए।

यह वह जगह है जहाँ UTF (यूनिकोड ट्रांसफॉर्मेशन फॉर्मेट) चलन में है। UTF एक एन्कोडिंग है: यह यूनिकोड कोड को अस्पष्ट बाइट अनुक्रमों के साथ मैप करता है।

  • UTF-32 "गूंगा" एन्कोडिंग है। सभी यूनिकोड कोड पॉइंट्स 4 बाइट्स लंबे होते हैं, इसलिए UTF-32 बड़े एंडियन बाइट ऑर्डर के साथ कोड पॉइंट को 4-बाइट नंबर (32-बिट, इसलिए नाम) के रूप में बताता है । इसलिए U+2603इनकोड किया गया है 0x00002603

    UTF-32 बहुत सरल है, लेकिन बहुत ही बेमानी भी है। अधिकांश आमतौर पर इस्तेमाल किए जाने वाले अक्षर ASCII रेंज में आते हैं और यूनिकोड में कोड पॉइंट्स 0-127 द्वारा दर्शाए जाते हैं, इसलिए UTF-32- एन्कोडेड फ़ाइलों में लगभग 3 में 4 बाइट्स शून्य होंगे। लगभग हर अंग्रेजी वाक्य ASCII के बजाय UTF-32 में एन्कोड किए जाने पर 4 गुना अधिक (बाइट्स में) हो जाता है।

  • UTF-8 (इंटरनेट पर बहुत सामान्य) ASCII वर्णों के लिए केवल 1 बाइट का उपयोग करता है, इसलिए यह ASCII- केवल फ़ाइलों में कोई उपरि लागू नहीं करता है (प्रत्येक ASCII फ़ाइल भी उसी सामग्री के साथ UTF-8 फ़ाइल है)। अन्य पात्रों को 6 बाइट तक की आवश्यकता होती है।

  • UTF-16 (विंडोज द्वारा उपयोग किया जाता है, केवल एक उदाहरण के लिए नाम) UTF-32 और UTF-8 के बीच एक समझौता है। कोड पॉइंट 16-बिट या 32-बिट सीक्वेंस के लिए एन्कोड किए गए हैं। यह ज्यादातर मामलों में UTF-8 की तुलना में अधिक अनावश्यक है, लेकिन इसे बनाए रखना आसान है और प्रक्रिया में तेज है।

अलग-अलग वर्णों के अलग-अलग UTF-x एन्कोडिंग में अलग-अलग अभ्यावेदन हो सकते हैं। उदाहरण के लिए UTF-8 क्रम 6 बाइट्स तक हो सकते हैं, जबकि UTF-16 क्रम 4 बाइट्स लंबे होते हैं, भले ही दोनों एक ही वर्ण सेट (यूनिकोड) को एन्कोड करते हैं। अधिक महीन दाने वाले एनकोडिंग (UTF-8) अनुक्रम लंबाई को इंगित करने के लिए अधिक बिट्स का उपयोग करते हैं, इसलिए उच्च कोड बिंदुओं के लिए एन्कोडेड मान लंबे और कम इष्टतम होते हैं।

dsolimano के उत्तर में आपके शेल के व्यवहार की व्याख्या है।


वास्तव में UTF-8 सभी यूनिकोड कोडपॉइंट्स के लिए सबसे लंबे 4 बाइट्स पर होगा। 5 या 6-बाइट अनुक्रम का उपयोग 21 बिट्स से अधिक मूल्यों को एनकोड करने के लिए किया जाता है
phuclv

1

यूनिकोड कोड अंक UTF-8 में एन्कोड किए गए

वे https://en.wikipedia.org/wiki/UTF-8#Description के कारण समतुल्य हैं , यूनिकोड कोड बिंदुओं को UTF-8 में परिवर्तित करने के लिए एल्गोरिथ्म देखें। यह इस प्रकार चलता है।

आपका कोड बिंदु 0x2192 , U + 0800 और U + FFFF के बीच है। इसलिए हम तालिका की तीसरी पंक्ति का उपयोग करते हैं।

                         Byte 1     Byte 2      Byte 3
16  U+0800  U+FFFF  3   1110xxxx    10xxxxxx    10xxxxxx

बाइनरी में 0x2192 है 0010 0001 1001 0010। चलो उस में प्लग करें, फिर उन लोगों को हेक्स में परिवर्तित करें

16  U+0800  U+FFFF  3   11100010    10000110    10010010
                    3   E   2       8   6       9   2

दूसरे शब्दों में E28692।

अपने खोल में अनुक्रम से बच

जब आप UTF-8 अनुक्रम में प्रवेश करते हैं तो आपका शेल सही तीर प्रदर्शित नहीं करता है, तो आइए bash मैनुअल देखें । एस्केप सीक्वेंस पर सेक्शन को खोजें \xHHऔर आप इसे वर्णित रूप से फाइनल कर लेंगे

आठ-बिट वर्ण जिसका मान हेक्साडेसिमल मान HH (एक या दो हेक्स अंक) है

तो आप बैश को तीन अलग-अलग दो चरित्र अनुक्रम प्रदर्शित करने के लिए कह रहे हैं, संभवतः आपको CIRCUMFLEX के साथ LATIN SMALL LETTER A , कुछ चुने हुए क्षेत्र के START , और किसी प्रकार का एक निजी उपयोग वर्ण दे रहा है।


इसलिए, यदि मैं UTF-8 टर्मिनल में UTF-8 कोड दर्ज करना चाहता हूं तो मैं यह कैसे करूं?
टायलर डर्डन

मुझे नहीं लगता कि आप एक गूंज के साथ, प्रलेखन से देखते हुए कर सकते हैं।
dsolimano
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.