एक यूनिकोड चरित्र कितने बाइट्स लेता है?


239

मैं एन्कोडिंग के बारे में थोड़ा उलझन में हूं। जहाँ तक मैं जानता हूँ कि पुराने ASCII वर्ण प्रति चरित्र एक बाइट लेते थे। एक यूनिकोड वर्ण को कितने बाइट की आवश्यकता होती है?

मुझे लगता है कि एक यूनिकोड चरित्र में किसी भी भाषा से हर संभव चरित्र हो सकता है - क्या मैं सही हूं? तो प्रति चरित्र कितने बाइट्स की आवश्यकता है?

और UTF-7, UTF-6, UTF-16 आदि का क्या मतलब है? क्या वे यूनिकोड के विभिन्न संस्करण हैं?

मैंने यूनिकोड के बारे में विकिपीडिया लेख पढ़ा लेकिन यह मेरे लिए काफी कठिन है। मैं एक सरल जवाब देखने के लिए उत्सुक हूं।



15
क्षमा करें, कोई सरल उत्तर नहीं है। मुझे पूरी बात थोड़ी गड़बड़ लगती है। यूनिकोड को दो बाइट्स का उपयोग करने के रूप में बिल किया गया था और सभी वर्णों का प्रतिनिधित्व करने में सक्षम था, लेकिन यह पता चला कि दो बाइट्स काफी पर्याप्त नहीं थे।
जोनाथन वुड

12
"सरल उत्तर": एक यूनिकोड वर्ण 1-4 बाइट्स लेता है। यूनिकोड में बहुत सी भाषाएं शामिल हैं लेकिन सभी नहीं। पिछली बार मैंने देखा था, उदाहरण के लिए क्लिंगन एक आधिकारिक यूनिकोड चरित्र सेट नहीं था।
पीटर जी।

9
क्लिंगन यूनिकोड मानक का हिस्सा नहीं है, नहीं। यह यूनीकोड ​​के निजी उपयोग क्षेत्र (U + F8D0 - U + F8FF) का उपयोग करता है।
रेमी लेबेऊ

1
उद्धारकर्ता प्रश्न - धन्यवाद। मेरी स्थिति SCORM 1.2 आज्ञाकारी LMS के माध्यम से डेटा संग्रहीत कर रही है ... SCORM 1.2 'cmi.suspend_data' के लिए मानक 4096 डेटा का बाइट्स है, जिसे पिछले डेवलपर ने माना था कि हम 4096 वर्णों को संग्रहीत कर सकते हैं। अरे यार वो गलत था - मैंने अभी-अभी पता लगाया है कि हमारी बुकमार्किंग लंबे कोर्स पर फेल क्यों होती है। इसलिए अब मुझे पता है कि हम UTF-8 का उपयोग कर रहे हैं, यह प्रति वर्ण 4 बाइट्स हमें 1024 वर्ण देता है।
danjah

जवाबों:


147

आप एक साधारण उत्तर नहीं देखेंगे क्योंकि वहाँ कोई नहीं है।

सबसे पहले, यूनिकोड में "हर भाषा से हर पात्र" नहीं होता है, हालाँकि यह सुनिश्चित करता है कि यह कोशिश करे।

यूनिकोड स्वयं एक मानचित्रण है, यह कोडपॉइंट्स को परिभाषित करता है और एक कोडपॉइंट एक संख्या है, जो आमतौर पर एक चरित्र से जुड़ी होती है। मैं आमतौर पर कहता हूं क्योंकि वर्णों के संयोजन जैसी अवधारणाएं हैं। आप लहजे, या umlauts जैसी चीजों से परिचित हो सकते हैं। जिनका उपयोग किसी अन्य वर्ण के साथ किया जा सकता है, जैसे कि aया uएक नया तार्किक चरित्र बनाने के लिए। इसलिए एक वर्ण में 1 या अधिक कोडपॉइंट हो सकते हैं।

कंप्यूटिंग सिस्टम में उपयोगी होने के लिए हमें इस जानकारी के लिए एक प्रतिनिधित्व चुनने की आवश्यकता है। वे विभिन्न यूनिकोड एनकोडिंग हैं, जैसे कि utf-8, utf-16le, utf-32 आदि। वे अपने कोडुनिट्स के आकार से बड़े पैमाने पर प्रतिष्ठित हैं। UTF-32 सबसे सरल एन्कोडिंग है, इसमें एक कोडुनिट है जो 32 बिट्स है, जिसका अर्थ है कि एक व्यक्तिगत कोडपॉइंट एक कोडुनिट में आराम से फिट बैठता है। अन्य एन्कोडिंग में ऐसी परिस्थितियाँ होंगी जहाँ एक कोडपॉइंट को कई कोडुनिट्स की आवश्यकता होगी, या उस विशेष कोडपॉइंट को एन्कोडिंग में बिल्कुल भी नहीं दिखाया जा सकता है (यह यूसीएस -2 के साथ उदाहरण के लिए एक समस्या है)।

वर्णों के संयोजन के लचीलेपन के कारण, किसी दिए गए एन्कोडिंग के भीतर भी प्रति वर्ण बाइट्स की संख्या वर्ण और सामान्यीकरण के आधार पर भिन्न हो सकती है। यह उन वर्णों से निपटने के लिए एक प्रोटोकॉल है, जिनमें एक से अधिक प्रतिनिधित्व हैं (आप कह सकते हैं कि "an 'a' with an accent"2 कोडपॉइंट हैं, जिनमें से एक संयोजन चार है या "accented 'a'"जो एक कोडपॉइंट है)।


1
ठीक है। फिर किसी दिए गए कोडपॉइंट में दर्शाए गए एक वर्ण को कितने बाइट्स लेते हैं? उदाहरण के लिए, गैर-ब्रेकिंग स्पेस।
निकोलस बारबुलेसको

संयोजन वर्ण एक प्रोग्रामर के जीवन को नरक बना देते हैं जब वह UTF8 सरणियों पर स्ट्रलेन (), पदार्थ () और अन्य स्ट्रिंग हेरफेर कार्यों को लिखने की बात करता है। इस तरह का काम कभी पूरा नहीं होगा और हमेशा छोटी गाड़ी होगी।
नुलिक

मैं एक डेमो है कि शो विंडोज़ -1252, UTF8 और UTF8-बीओएम इनकोडिंग प्रत्येक एन्कोडिंग के साथ व्याख्या की फाइलों में लिखा है, और परिणाम के बीच समानता तुलना: github.com/vladyrn/encodings_demo
Vlad

195

अजीब तरह से, किसी ने भी यह नहीं बताया कि एक यूनिकोड चार को कितने बाइट्स की गणना करना है। यहाँ UTF-8 एन्कोडेड स्ट्रिंग्स के लिए नियम है:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation byte: one of 1-3 bytes following the first
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF7   First byte of a 4-byte character encoding

तो त्वरित उत्तर है: यह 1 से 4 बाइट्स लेता है, पहले एक पर निर्भर करता है जो यह इंगित करेगा कि यह कितने बाइट लेगा।


8
मेरा मानना ​​है कि 4-बाइट वर्ण के लिए अधिकतम हेक्स मान 0xF7 (0xF4 नहीं) है।
डीजेपीजे

आपको बहुत - बहुत धन्यवाद! IETF मानक के माध्यम से मैं सिर्फ नियंत्रण + f'ing था, और मुझे एन्कोडिंग के बारे में कुछ भी नहीं मिला, और मैं जो लेख पढ़ रहा था, वह यह बताने के लिए पर्याप्त विस्तार में नहीं गया कि कितने कोडिंग कोड का प्रतिनिधित्व करने के लिए कितने बिट्स का उपयोग किया जाता है। "वर्ण" के अनुसार अंक।
मार्कस जे

1
यह अब नए टीम के सदस्यों के लिए मेरे "परिचय पत्र" के दूसरे पृष्ठ पर है, साथ ही पहली दो टिप्पणियाँ
Cee McSharpface

1
0xF4 एक गलती नहीं थी, लेकिन एक स्पष्टीकरण था। यूनिकोड कोडपॉइंट्स 0-0x10ffff रेंज में हैं इसलिए अंतिम कोडपॉइंट को F4 8F BF BF के रूप में कोडित किया गया है।
फ्रेडियानो ज़िग्लियो 10

38

मुझे पता है कि यह प्रश्न पुराना है और पहले से ही एक स्वीकृत उत्तर है, लेकिन मैं कुछ उदाहरण प्रस्तुत करना चाहता हूं (उम्मीद है कि यह किसी के लिए उपयोगी होगा)।

जहाँ तक मैं जानता हूँ कि पुराने ASCII वर्ण प्रति चरित्र एक बाइट लेते थे।

सही। दरअसल, चूंकि एएससीआईआई 7-बिट एन्कोडिंग है, यह 128 कोड (जिनमें से प्रिंट करने योग्य हैं) का समर्थन करता है, इसलिए यह केवल आधा बाइट (यदि इसका कोई मतलब है) का उपयोग करता है।

एक यूनिकोड वर्ण को कितने बाइट की आवश्यकता होती है?

यूनिकोड सिर्फ पात्रों को कोडपॉइंट्स में मैप करता है। यह परिभाषित नहीं करता है कि उन्हें कैसे एनकोड करना है। एक पाठ फ़ाइल में यूनिकोड वर्ण नहीं होते हैं, लेकिन बाइट्स / ऑक्टेट जो यूनिकोड वर्णों का प्रतिनिधित्व कर सकते हैं।

मुझे लगता है कि एक यूनिकोड चरित्र में किसी भी भाषा से हर संभव चरित्र हो सकता है - क्या मैं सही हूं?

नहीं, लेकिन लगभग। तो मूल रूप से हाँ। लेकिन फिर भी नहीं।

तो प्रति चरित्र कितने बाइट्स की आवश्यकता है?

अपने दूसरे प्रश्न के रूप में भी।

और UTF-7, UTF-6, UTF-16 आदि का क्या मतलब है? क्या वे कुछ यूनिकोड संस्करण हैं?

नहीं, वे एनकोडिंग हैं। वे परिभाषित करते हैं कि बाइट्स / ऑक्टेट्स को यूनिकोड वर्णों का प्रतिनिधित्व कैसे करना चाहिए।

उदाहरण के एक जोड़े। यदि उनमें से कुछ आपके ब्राउज़र में प्रदर्शित नहीं किए जा सकते हैं (शायद इसलिए कि फ़ॉन्ट उनका समर्थन नहीं करता है), एक छवि देखने के लिए http://codepoints.net/U+1F6AA( 1F6AAहेक्स में कोडपॉइंट के साथ बदलें ) पर जाएं।

    • U + 0061 लेटिन छोटे अक्षर A: a
      • : 97
      • UTF-8: 61
      • UTF-16: 00 61
    • U + 00A9 COPYRIGHT साइन: ©
      • N: 169
      • UTF-8: C2 A9
      • UTF-16: 00 A9
    • U + 00AE पंजीकृत संकेत: ®
      • N: 174
      • UTF-8: C2 AE
      • यूटीएफ -16: 00 एई
    • यू + 1337 एथलेटिक लक्षण PHWA:
      • : 4919
      • UTF-8: E1 8C B7
      • UTF-16: 13 37
    • U + 2014 EM DASH:
      • : 8212
      • UTF-8: E2 80 94
      • UTF-16: 20 14
    • U + 2030 प्रति मील का चिह्न:
      • : 8240
      • UTF-8: E2 80 B0
      • UTF-16: 20 30
    • U + 20AC यूरो हस्ताक्षर:
      • N: 8364
      • UTF-8: E2 82 AC
      • यूटीएफ -16: 20 एसी
    • U + 2122 व्यापार मार्क हस्ताक्षर:
      • : 8482
      • UTF-8: E2 84 A2
      • UTF-16: 21 22
    • U + 2603 SNOWMAN:
      • N: 9731
      • UTF-8: E2 98 83
      • UTF-16: 26 03
    • U + 260E ब्लैक टेलफ़ोन:
      • : 9742
      • UTF-8: E2 98 8E
      • UTF-16: 26 0E
    • रैन ड्रॉप्स के साथ U + 2614 UMBRELLA:
      • N: 9748
      • UTF-8: E2 98 94
      • UTF-16: 26 14
    • U + 263A सफेद SMILING चेहरा:
      • : 9786
      • UTF-8: E2 98 बीए
      • यूटीएफ -16: 26 3 ए
    • U + 2691 ब्लैक फ्लैग:
      • N: 9873
      • UTF-8: E2 9A 91
      • UTF-16: 26 91
    • U + 269B ATOM SYMBOL:
      • N: 9883
      • UTF-8: E2 9A 9B
      • UTF-16: 26 9B
    • U + 2708 AIRPLANE:
      • N: 9992
      • UTF-8: E2 9C 88
      • UTF-16: 27 08
    • U + 271E शेडेड व्हाइट लेटिन क्रॉस:
      • N: 10014
      • UTF-8: E2 9C 9E
      • यूटीएफ -16: 27 1 ई
    • U + 3020 POSTAL MARK FACE:
      • N: 12320
      • UTF-8: E3 80 A0
      • UTF-16: 30 20
    • U + 8089 CJK यूनिफ़ाइड IDEOGRAPH-8089:
      • N: 32905
      • UTF-8: E8 82 89
      • UTF-16: 80 89
    • U + 1F4A9 पू का ढेर: 💩
      • N: 128169
      • UTF-8: F0 9F 92 A9
      • UTF-16: D8 3D DC A9
    • U + 1F680 ROCKET: 🚀
      • N: 128640
      • UTF-8: F0 9F 9A 80
      • UTF-16: D8 3D DE 80

ठीक है मैं ले जा रहा हूँ ...

मजेदार तथ्य:

  • यदि आप एक विशिष्ट चरित्र की तलाश में हैं, तो आप इसे http://codepoint.net/ पर कॉपी और पेस्ट कर सकते हैं ।
  • मैंने इस बेकार सूची में बहुत समय बर्बाद किया (लेकिन यह क्रमबद्ध है!)।
  • MySQL में "utf8" नामक एक चारसेट है जो वास्तव में 3 बाइट्स से अधिक वर्णों का समर्थन नहीं करता है। इसलिए आप पू का ढेर नहीं लगा सकते , मैदान चुपचाप छंट जाएगा। इसके बजाय "utf8mb4" का उपयोग करें।
  • एक स्नोमैन परीक्षण पृष्ठ (unicodesnowmanforyou.com) है

कोड इकाइयों UTF-16 में 16 बिट विस्तृत कर रहे हैं। आपने उन्हें बीच में एक जगह के साथ दिखाया, जो भ्रामक है। © के लिए UTF-16 का प्रतिनिधित्व 00A9इसके बजाय होना चाहिए 00 A9(जो UTF-16BE होगा)।
रोलैंड इलिग

क्या फर्क पड़ता है? क्या बड़े एंडियन के लिए नहीं होना चाहिए? उन्होंने इसे बड़े एंडियन में लिखा है, और इसलिए बड़े एंडियन यूटीएफ -16 में लिखी गई फाइल यूटीएफ -16 बीई के समान ही होगी, है ना?
HappyPandaFace

6
सुधार: 1) एएससीआईआई 7 बिट्स है, एक बाइट 8 बिट्स है, इसलिए यह आधे से अधिक है। 2) यूनिकोड परिभाषित करता है कि कोड बिंदुओं को कैसे एनकोड करना है। यूटीएफ -8, यूटीएफ -16 और यूटीएफ -32 यूनिकोड मानक में परिभाषित किए गए हैं।
जोनाथन रोजेन 10

3
@JonathanRosenne मुझे लगता है कि इसका मतलब है कि यह केवल 8 बिट्स के साथ प्रतिनिधित्व करने योग्य संभावित मानों में से आधे का उपयोग करता है, यह नहीं कि यह आधे बिट्स का उपयोग करता है।
अरिजित लोपेज

2
मुझे वास्तव में उदाहरण पसंद हैं। वे इस बात पर प्रकाश डालते हैं कि कोई व्यक्ति UTF-16 को UTF-8 से अधिक क्यों पसंद कर सकता है। अलग-अलग सॉफ़्टवेयर के डेवलपर्स अलग-अलग एनकोडिंग का चयन कर सकते हैं, जिसके आधार पर यूनिकोड के पात्रों का उपयोग करने की अधिक संभावना है। उदाहरण के लिए चीन / जापान में, UTF-16 (2-बाइट) UTF-8 उनके लिए अधिक से अधिक समझ में आता है, क्योंकि एक ही वर्ण अक्सर UTF-8 में एन्कोड करने के लिए कई बाइट के रूप में दो बार की आवश्यकता होगी
माइक

29

बस बोलना Unicodeएक मानक है जिसने दुनिया के सभी पात्रों को एक नंबर (कोड बिंदु कहा जाता है) सौंपा (यह अभी भी प्रगति पर काम करता है)।

अब आपको बाइट्स का उपयोग करके इस कोड बिंदुओं का प्रतिनिधित्व करने की आवश्यकता है, जिसे कहा जाता है character encodingUTF-8, UTF-16, UTF-6उन पात्रों का प्रतिनिधित्व करने के तरीके हैं।

UTF-8मल्टीबाइट कैरेक्टर एन्कोडिंग है। वर्णों में 1 से 6 बाइट्स हो सकते हैं (उनमें से कुछ की अभी आवश्यकता नहीं हो सकती है)।

UTF-32 प्रत्येक वर्ण में 4 वर्ण होते हैं।

UTF-16प्रत्येक वर्ण के लिए 16 बिट्स का उपयोग करता है और यह BMP नामक सभी यूनिकोड वर्णों के भाग का प्रतिनिधित्व करता है (सभी व्यावहारिक उद्देश्यों के लिए पर्याप्त है)। जावा अपने स्ट्रिंग्स में इस एन्कोडिंग का उपयोग करता है।


10
यूनिकोड एक 21-बिट कोड सेट है और UTF-8 में किसी भी यूनिकोड वर्ण का प्रतिनिधित्व करने के लिए 4 बाइट्स पर्याप्त हैं। UTF-16 BMP (मूल बहुभाषी विमान) के बाहर वर्णों का प्रतिनिधित्व करने के लिए सरोगेट का उपयोग करता है; किसी भी वैध यूनिकोड वर्ण का प्रतिनिधित्व करने के लिए इसे 2 या 4 बाइट्स की आवश्यकता होती है। UCS-2 बीएमपी के बाहर सरोगेट या पात्रों के समर्थन के बिना UTF-16 का केवल 16-बिट संस्करण था।
जोनाथन लेफ्लर

1
तुम सही हो। UTF-8 मूल एक में 32 बिट समायोजित करने के लिए 6 बाइट्स थे। मैं वास्तव में चीजों को अधिक जटिल नहीं करना चाहता था क्योंकि वह पहले से ही विकी डॉक के साथ भ्रमित था :)
जिमाओ

3
यह उत्तर बताता है कि UTF-16 बीएमपी कोड बिंदुओं को एनकोड नहीं कर सकता है। यह गलत है, क्योंकि ये यूटीएफ -8 में सरोगेट जोड़े का उपयोग करते हुए ही इनकोड किए जा सकते हैं। (आप पुराने UCS-2 के बारे में सोच रहे होंगे, इससे पहले कि यूनिकोड 2.0 सामने आया, जिसने केवल 16-बिट कोड बिंदुओं को एन्कोड किया।) इसके अलावा, जावा UTF-16 का उपयोग नहीं करता है, यह एक संशोधित रूप का उपयोग करता है जहां कोड बिंदु होता है। 0 को अलग तरीके से एन्कोड किया गया है।
rdb

@rdb - यह विपरीत है। उत्तर कहता है कि UTF-16 बीएमपी का प्रतिनिधित्व करता है।
निकोलस बारबुलेसको

3
मैंने गलती की; मेरे कहने का मतलब था "गैर-बीएमपी"। उत्तर में त्रुटि यह है कि यह कहता है कि UTF-16 बीएमपी वर्णों का प्रतिनिधित्व करता है, जो कि गलत है। UTF-16 सभी यूनिकोड वर्णों को एन्कोड कर सकता है - गैर-बीएमपी वर्णों को सरोगेट जोड़े के माध्यम से एन्कोड किया जाता है। शायद उत्तरदाता UCS-2 से भ्रमित था।
rdb

17

UTF-8 में:

1 byte:       0 -     7F     (ASCII)
2 bytes:     80 -    7FF     (all European plus some Middle Eastern)
3 bytes:    800 -   FFFF     (multilingual plane incl. the top 1792 and private-use)
4 bytes:  10000 - 10FFFF

UTF-16 में:

2 bytes:      0 -   D7FF     (multilingual plane except the top 1792 and private-use )
4 bytes:   D800 - 10FFFF

UTF-32 में:

4 bytes:      0 - 10FFFF

10FFFF परिभाषा द्वारा अंतिम यूनिकोड कोडपॉइंट है, और यह इस तरह परिभाषित है क्योंकि यह UTF-16 की तकनीकी सीमा है।

यह सबसे बड़ा कोडपॉइंट UTF-8 को 4 बाइट में एन्कोड कर सकता है, लेकिन UTF-8 के एन्कोडिंग के पीछे का विचार कोडफॉर्म्स को कवर करने के लिए 5 और 6 बाइट एनकोडिंग के लिए भी काम करता है, जब तक कि 7FFFFFFF यानी। UTF-32 क्या कर सकता है का आधा।


8

यूनिकोड में उत्तर आसानी से नहीं दिया जाता है। समस्या, जैसा कि आपने पहले ही बताया है, एनकोडिंग हैं।

बिना वर्णनात्मक वर्णों के किसी भी अंग्रेजी वाक्य को देखते हुए, UTF-8 के लिए उत्तर वर्णों के रूप में कई बाइट्स होंगे और UTF-16 के लिए यह वर्णों की संख्या दो होगी।

एकमात्र एन्कोडिंग जहां (अभी के अनुसार) हम आकार के बारे में बयान कर सकते हैं UTF-32। यह हमेशा 32 बिट प्रति वर्ण है, भले ही मुझे लगता है कि कोड अंक भविष्य के UTF-64 के लिए तैयार हैं :)

क्या इतना मुश्किल है कम से कम दो चीजें हैं:

  1. रचित वर्ण, जहां पहले से ही उच्चारण / वर्णक (where) वर्ण इकाई का उपयोग करने के बजाय, एक उपयोगकर्ता ने उच्चारण और आधार चरित्र (`ए) को संयोजित करने का निर्णय लिया।
  2. कोड अंक। कोड पॉइंट वह विधि है जिसके द्वारा UTF- एनकोडिंग बिट्स की संख्या से अधिक एनकोड करने की अनुमति देता है जो उन्हें अपना नाम देता है जो आमतौर पर अनुमति देगा। उदाहरण के लिए, UTF-8 कुछ बाइट्स को निर्दिष्ट करता है जो अपने आप अमान्य हैं, लेकिन जब एक वैध निरंतरता बाइट द्वारा पीछा किया जाता है तो यह 0..255 के 8-बिट रेंज से परे एक चरित्र का वर्णन करने की अनुमति देगा। देखें उदाहरण UTF-8 पर विकिपीडिया लेख में नीचे और अधिक लंबा एन्कोडिंग।
    • वहां दिया गया उत्कृष्ट उदाहरण यह है कि € चरित्र (कोड बिंदु U+20ACको तीन-बाइट अनुक्रम E2 82 ACया चार-बाइट अनुक्रम के रूप में दर्शाया जा सकता है F0 82 82 AC
    • दोनों मान्य हैं, और यह दिखाता है कि "यूनिकोड" के बारे में बात करने पर उत्तर कितना जटिल है और यूनिकोड के विशिष्ट एन्कोडिंग के बारे में नहीं है, जैसे कि यूटीएफ -8 या यूटीएफ -16।


4

वैसे मैंने अभी इस पर विकिपीडिया पेज भी खींचा है, और इंट्रो भाग में मैंने देखा "यूनिकोड को विभिन्न चरित्र एन्कोडिंग द्वारा कार्यान्वित किया जा सकता है। सबसे अधिक उपयोग किए जाने वाले एन्कोडिंग UTF-8 हैं (जो किसी भी ASCD वर्ण के लिए एक बाइट का उपयोग करता है, जिसमें है UTF-8 और ASCII दोनों एन्कोडिंग में समान कोड मान, और अन्य वर्णों के लिए चार बाइट तक), अब-अप्रचलित UCS-2 (जो प्रत्येक वर्ण के लिए दो बाइट्स का उपयोग करता है, लेकिन वर्तमान यूनिकोड मानक में प्रत्येक वर्ण को सांकेतिक शब्दों में बदलना नहीं कर सकता है)

जैसा कि यह उद्धरण दर्शाता है, आपकी समस्या यह है कि आप मान रहे हैं कि यूनिकोड वर्णों को कूटने का एक तरीका है। यूनिकोड के वास्तव में कई रूप हैं, और फिर से, उस बोली में, उनमें से एक में भी प्रति वर्ण 1 बाइट है जैसे आप क्या करने के लिए उपयोग किए जाते हैं।

तो आपका सरल उत्तर जो आप चाहते हैं, वह भिन्न है।


3

यदि यह 0xD800 या अधिक से शुरू होता है, तो UTF-16 के लिए, चरित्र को चार बाइट्स (दो कोड यूनिट) की आवश्यकता होती है; इस तरह के चरित्र को "सरोगेट जोड़ी" कहा जाता है। विशेष रूप से, एक सरोगेट जोड़ी का रूप होता है:

[0xD800 - 0xDBFF]  [0xDC00 - 0xDFF]

जहां [...] दी गई सीमा के साथ दो-बाइट कोड इकाई को इंगित करता है। कुछ भी <= 0xD7FF एक कोड इकाई (दो बाइट्स) है। कुछ भी> = 0xE000 अमान्य है (BOM मार्करों को छोड़कर, यकीनन)।

Http://unicodebook.readthedocs.io/unicode_encodings.html , अनुभाग 7.5 देखें ।


1

इस यूनिकोड कोड कनवर्टर को देखें । उदाहरण के लिए, दर्ज करें 0x2009, जहां "0x ... संकेतन" फ़ील्ड में 2009 पतली जगह के लिए यूनिकोड संख्या है , और कन्वर्ट पर क्लिक करें। हेक्साडेसिमल संख्या E2 80 89(3 बाइट्स) "UTF-8 कोड इकाइयों" फ़ील्ड में दिखाई देती है।


1

विकी से:

UTF-8, एक 8-बिट चर-चौड़ाई एन्कोडिंग जो ASCII के साथ संगतता को अधिकतम करती है;

यूटीएफ -16, एक 16-बिट, चर-चौड़ाई एन्कोडिंग;

UTF-32, एक 32-बिट, निश्चित-चौड़ाई वाला एन्कोडिंग।

ये तीन सबसे लोकप्रिय विभिन्न एन्कोडिंग हैं।

  • UTF-8 में प्रत्येक वर्ण को 1 से 4 बाइट्स (प्रमुख एन्कोडिंग) में एन्कोड किया गया है
  • UTF16 में प्रत्येक वर्ण को 1 से दो 16-बिट शब्दों में एन्कोड किया गया है और
  • UTF-32 में प्रत्येक वर्ण को एक 32-बिट शब्द के रूप में एन्कोड किया गया है।

1

Unicodeएक मानक है जो हर चरित्र के लिए एक अद्वितीय संख्या प्रदान करता है। इन अद्वितीय संख्याओं को code pointदुनिया में मौजूद सभी वर्णों के लिए s (जो कि केवल अद्वितीय कोड है) कहा जाता है (कुछ को अभी भी जोड़ा जाना है)।

विभिन्न उद्देश्यों के लिए, आपको code pointsबाइट्स में इसका प्रतिनिधित्व करने की आवश्यकता हो सकती है (अधिकांश प्रोग्रामिंग भाषाएं ऐसा करती हैं), और यहां जहां Character Encodingकिक करता है।

UTF-8, UTF-16, UTF-32और इतने पर सभी कर रहे हैं Character Encodings, और यूनिकोड के कोड अंक अलग अलग तरीकों से इन एनकोडिंग में प्रतिनिधित्व कर रहे हैं,।


UTF-8 एन्कोडिंग में एक चर-चौड़ाई की लंबाई होती है, और वर्ण, इसमें एन्कोडेड, 1 से 4 बाइट्स सम्मिलित कर सकते हैं;

UTF-16इसमें परिवर्तनशील लंबाई और वर्ण हैं, इसमें एन्कोड किया गया है, या तो 1 या 2 बाइट ले सकता है (जो 8 या 16 बिट्स है)। यह बीएमपी (बेसिक मल्टीलिंगुअल प्लेन) कहे जाने वाले सभी यूनिकोड वर्णों का केवल एक हिस्सा है और यह लगभग सभी मामलों के लिए पर्याप्त है। जावा UTF-16अपने तार और पात्रों के लिए एन्कोडिंग का उपयोग करता है ;

UTF-32 की लंबाई निर्धारित की गई है और प्रत्येक वर्ण में 4 बाइट्स (32 बिट्स) हैं।

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