string - एक यूनिकोड चरित्र कितने बाइट करता है?
language-agnostic unicode (7)
आपको एक साधारण उत्तर नहीं दिखाई देगा क्योंकि कोई नहीं है।
सबसे पहले, यूनिकोड में "हर भाषा से प्रत्येक चरित्र" नहीं होता है, हालांकि यह सुनिश्चित करता है कि कोशिश करें।
यूनिकोड स्वयं मैपिंग है, यह कोडपॉइंट्स को परिभाषित करता है और एक कोडपॉइंट एक संख्या है, जो आम तौर पर एक चरित्र से जुड़ा होता है। मैं आमतौर पर कहता हूं क्योंकि चरित्रों को संयोजित करने जैसी अवधारणाएं हैं। आप लहजे, या उमोट्स जैसी चीज़ों से परिचित हो सकते हैं। उनको एक और चरित्र के साथ प्रयोग किया जा सकता है, जैसे कि a
या u
एक नया तार्किक चरित्र बनाने के लिए। इसलिए एक चरित्र में 1 या अधिक कोडपॉइंट शामिल हो सकते हैं।
कंप्यूटिंग सिस्टम में उपयोगी होने के लिए हमें इस जानकारी के लिए एक प्रतिनिधित्व चुनने की जरूरत है। वे विभिन्न यूनिकोड एन्कोडिंग हैं, जैसे यूटीएफ -8, यूटीएफ -16 एल, यूटीएफ -32 इत्यादि। इन्हें बड़े पैमाने पर उनके कोड्यूनिट के आकार से अलग किया जाता है। यूटीएफ -32 सबसे सरल एन्कोडिंग है, इसमें 32 बिट्स कोड कोडिट है, जिसका अर्थ है कि एक व्यक्तिगत कोडपॉइंट एक कोड्यूनिट में आराम से फिट बैठता है। अन्य एन्कोडिंग में ऐसी स्थितियां होंगी जहां कोडपॉइंट को एकाधिक कोडुनिट की आवश्यकता होगी, या उस विशेष कोडपॉइंट को एन्कोडिंग में बिल्कुल प्रदर्शित नहीं किया जा सकता है (उदाहरण के लिए यह यूसीएस -2 के साथ एक समस्या है)।
वर्णों को संयोजित करने की लचीलापन के कारण, यहां दिए गए एन्कोडिंग के भीतर वर्ण प्रति बाइट्स की संख्या चरित्र और सामान्यीकरण फ़ॉर्म के आधार पर भिन्न हो सकती है। यह उन वर्णों से निपटने के लिए एक प्रोटोकॉल है जिसमें एक से अधिक प्रतिनिधित्व हैं (आप "an 'a' with an accent"
कह सकते हैं जो 2 कोडपॉइंट्स है, जिनमें से एक संयोजन संयोजन या "accented 'a'"
जो एक कोडपॉइंट है )।
मैं एन्कोडिंग के बारे में थोड़ा उलझन में हूँ। जहां तक मुझे पता है कि पुराने ASCII वर्ण प्रति चरित्र एक बाइट लेते हैं। यूनिकोड चरित्र की कितनी बाइट्स की आवश्यकता होती है?
मुझे लगता है कि एक यूनिकोड चरित्र में किसी भी भाषा से हर संभव चरित्र हो सकता है - क्या मैं सही हूँ? तो प्रति चरित्र कितने बाइट्स की आवश्यकता है?
और यूटीएफ -7, यूटीएफ -6, यूटीएफ -16 आदि का क्या अर्थ है? क्या वे यूनिकोड के विभिन्न संस्करण हैं?
मैंने यूनिकोड के बारे में विकिपीडिया लेख पढ़ा लेकिन यह मेरे लिए काफी मुश्किल है। मैं एक साधारण जवाब देखने की उम्मीद कर रहा हूं।
आश्चर्यजनक रूप से पर्याप्त, कोई भी इस बात की ओर इशारा नहीं करता कि कितने बाइट्स एक यूनिकोड चार ले रहा है। यूटीएफ -8 एन्कोडेड स्ट्रिंग्स का नियम यहां दिया गया है:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
तो त्वरित उत्तर यह है: पहले 1 के आधार पर 1 से 4 बाइट लगते हैं जो इंगित करेंगे कि यह कितने बाइट उठाएगा।
अद्यतन करें
जैसा कि प्रीवेट ने बताया, यह नियम केवल यूटीएफ -8 पर लागू होता है
बस Unicode
बोलना एक मानक है जो दुनिया के सभी पात्रों (यह अभी भी प्रगति पर काम करता है) को एक नंबर (कोड बिंदु कहा जाता है) असाइन किया गया है।
अब आपको बाइट्स का उपयोग करके इस कोड पॉइंट का प्रतिनिधित्व करने की आवश्यकता है, जिसे character encoding
कहा जाता है। UTF-8, UTF-16, UTF-6
उन पात्रों का प्रतिनिधित्व करने के तरीके हैं।
UTF-8
मल्टीबाइट वर्ण एन्कोडिंग है। अक्षरों में 1 से 6 बाइट हो सकते हैं (उनमें से कुछ को अभी आवश्यकता नहीं हो सकती है)।
UTF-32
प्रत्येक पात्रों में 4 बाइट्स वर्ण होते हैं।
UTF-16
प्रत्येक चरित्र के लिए 16 बिट्स का उपयोग करता है और यह बीएमपी नामक यूनिकोड वर्णों का केवल एक हिस्सा दर्शाता है (सभी व्यावहारिक उद्देश्यों के लिए यह पर्याप्त है)। जावा इस स्ट्रिंग में इस एन्कोडिंग का उपयोग करता है।
मुझे पता है कि यह प्रश्न पुराना है और पहले से ही एक स्वीकार्य उत्तर है, लेकिन मैं कुछ उदाहरण देना चाहता हूं (उम्मीद है कि यह किसी के लिए उपयोगी होगा)।
जहां तक मुझे पता है कि पुराने ASCII वर्ण प्रति चरित्र एक बाइट लेते हैं।
सही। दरअसल, चूंकि एएससीआईआई 7-बिट एन्कोडिंग है, इसलिए यह 128 कोड का समर्थन करता है (जिनमें से 9 5 प्रिंट करने योग्य हैं), इसलिए यह केवल आधे बाइट का उपयोग करता है (यदि यह कोई समझ में आता है)।
यूनिकोड चरित्र की कितनी बाइट्स की आवश्यकता होती है?
यूनिकोड सिर्फ कोडपॉइंट्स के अक्षरों को मानचित्र करता है। यह परिभाषित नहीं करता है कि उन्हें कैसे एन्कोड करना है। एक टेक्स्ट फ़ाइल में यूनिकोड वर्ण नहीं होते हैं, लेकिन बाइट्स / ऑक्टेट्स जो यूनिकोड वर्णों का प्रतिनिधित्व कर सकते हैं।
मुझे लगता है कि एक यूनिकोड चरित्र में किसी भी भाषा से हर संभव चरित्र हो सकता है - क्या मैं सही हूँ?
नहीं, लेकिन लगभग। तो मूल रूप से हाँ। लेकिन अभी भी नहीं।
तो प्रति चरित्र कितने बाइट्स की आवश्यकता है?
आपके दूसरे प्रश्न के समान ही।
और यूटीएफ -7, यूटीएफ -6, यूटीएफ -16 आदि का क्या अर्थ है? क्या वे कुछ तरह के यूनिकोड संस्करण हैं?
नहीं, वे एन्कोडिंग हैं। वे परिभाषित करते हैं कि बाइट्स / ऑक्टेट्स को यूनिकोड वर्णों का प्रतिनिधित्व करना चाहिए।
कुछ उदाहरण यदि उनमें से कुछ को आपके ब्राउज़र में प्रदर्शित नहीं किया जा सकता है (संभवतः क्योंकि फ़ॉन्ट उन्हें समर्थन नहीं देता है), छवि देखने के लिए http://codepoints.net/U+1F6AA
(हेक्स में 1F6AA
साथ 1F6AA
को प्रतिस्थापित करें) पर जाएं।
- यू +0061 लैटिन लघु पत्र ए:
a
- एनसीएच: 9 7
- यूटीएफ -8: 61
- यूटीएफ -16: 00 61
- यू +0061 लैटिन लघु पत्र ए:
- यू + 00 ए 9 कॉपीराइट हस्ताक्षर:
©
- एनसीएच: 16 9
- यूटीएफ -8: सी 2 ए 9
- यूटीएफ -16: 00 ए 9
- यू + 00 एई पंजीकृत साइन इन करें:
®
- एनसीएच: 174
- यूटीएफ -8: सी 2 एई
- यूटीएफ -16: 00 एई
- यू + 00 ए 9 कॉपीराइट हस्ताक्षर:
- यू + 1337 एथियोपिक सिलेबल PHWA:
ጷ
- एनसीएच: 4 9 1 9
- यूटीएफ -8: ई 1 8 सी बी 7
- यूटीएफ -16: 13 37
- यू + 2014 ईएम दश:
—
- एनसीएच: 8212
- यूटीएफ -8: ई 2 80 9 4
- यूटीएफ -16: 20 14
- यू +2030 प्रति मिलियन साइन इन करें:
‰
- एनसीएच: 8240
- यूटीएफ -8: ई 2 80 बी 0
- यूटीएफ -16: 20 30
- यू + 20 एसी यूरो साइन इन करें:
€
- एनसीएच: 8364
- यूटीएफ -8: ई 2 82 एसी
- यूटीएफ -16: 20 एसी
- यू +2122 व्यापार मार्क साइन इन करें:
™
- एनसीएच: 8482
- यूटीएफ -8: ई 2 84 ए 2
- यूटीएफ -16: 21 22
- यू +2603 ज्ञान:
☃
- एनसीएच: 9 731
- यूटीएफ -8: ई 2 98 83
- यूटीएफ -16: 26 03
- यू +260 ई काले टेलीफ़ोन:
☎
- एनसीएच: 9742
- यूटीएफ -8: ई 2 98 8 ई
- यूटीएफ -16: 26 0 ई
- बारिश ड्रॉप्स के साथ यू +2614 उम्ब्रेला:
☔
- एनसीएच: 9748
- यूटीएफ -8: ई 2 98 9 4
- यूटीएफ -16: 26 14
- यू +263 ए सफेद स्माइलिंग फेस:
☺
- एनसीएच: 9 786
- यूटीएफ -8: ई 2 98 बीए
- यूटीएफ -16: 26 3 ए
- यू + 26 9 1 काला फ्लैग:
⚑
- एनसीएच: 9873
- यूटीएफ -8: ई 2 9 ए 91
- यूटीएफ -16: 26 9 1
- यू + 26 9 बी एटम सिम्बोल: ⚛
- एनसीएच: 9883
- यूटीएफ -8: ई 2 9 ए 9 बी
- यूटीएफ -16: 26 9 बी
- यू + 2708 एयरलाइंस:
✈
- एनसीएच: 99 2 9
- यूटीएफ -8: ई 2 9 सी 88
- यूटीएफ -16: 27 08
- यू + 271 ई छायादार सफेद लैटिन क्रॉस:
✞
- एनसीएच: 10014
- यूटीएफ -8: ई 2 9 सी 9 ई
- यूटीएफ -16: 27 1 ई
- यू +3020 पोस्टल मार्क फेस:
〠
- एनसीएच: 12320
- यूटीएफ -8: ई 3 80 ए 0
- यूटीएफ -16: 30 20
- यू +8089 सीजेके यूनिफाइड IDEOGRAPH-8089:
肉
- एनसीएच: 32 9 05
- यूटीएफ -8: ई 8 82 89
- यूटीएफ -16: 80 89
- यू + 1337 एथियोपिक सिलेबल PHWA:
- यू + 1 एफ 4 ए 9 पुल की पुल: 💩
- एनसीएच: 128169
- यूटीएफ -8: एफ 0 9 एफ 92 ए 9
- यूटीएफ -16: डी 8 3 डी डीसी ए 9
- यू + 1 एफ 680 रॉकेट:
🚀
- एनसीएच: 128640
- यूटीएफ -8: एफ 0 9 एफ 9 ए 80
- यूटीएफ -16: डी 8 3 डी डी 80
- यू + 1 एफ 4 ए 9 पुल की पुल: 💩
ठीक है मैं दूर ले जा रहा हूँ ...
मजेदार तथ्य:
- यदि आप एक विशिष्ट चरित्र की तलाश में हैं, तो आप इसे http://codepoints.net/ पर कॉपी और पेस्ट कर सकते हैं।
- मैंने इस बेकार सूची पर बहुत समय बर्बाद कर दिया (लेकिन यह हल हो गया है!)।
- MySQL में "utf8" नामक एक वर्णमाला है जो वास्तव में 3 बाइट्स से अधिक अक्षरों का समर्थन नहीं करती है। तो आप पू के ढेर को सम्मिलित नहीं कर सकते हैं , मैदान चुपचाप छोटा कर दिया जाएगा। इसके बजाए "utf8mb4" का प्रयोग करें।
- एक स्नोमैन टेस्ट पेज है (unicodesnowmanforyou.com) ।
यूटीएफ -16 के लिए, चरित्र को चार बाइट्स (दो कोड इकाइयां) की आवश्यकता होती है यदि यह 0xD800 या इससे अधिक के साथ शुरू होता है; ऐसे चरित्र को "सरोगेट जोड़ी" कहा जाता है। अधिक विशेष रूप से, एक सरोगेट जोड़ी का रूप है:
[0xD800 - 0xDBFF] [0xDC00 - 0xDFF]
जहां [...] दी गई सीमा के साथ दो-बाइट कोड इकाई इंगित करता है। कुछ भी <= 0xD7FF एक कोड इकाई (दो बाइट्स) है। कुछ भी> = 0xE000 अमान्य है (बम मार्कर को छोड़कर, तर्कसंगत रूप से)।
http://unicodebook.readthedocs.io/unicode_encodings.html , अनुभाग 7.5 देखें।
यूटीएफ -8 में किसी भी स्ट्रिंग के बाइट्स की गणना करने के लिए एक शानदार टूल है: http://mothereff.in/byte-counter
अपडेट करें: @mathias ने कोड सार्वजनिक किया है: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
यूनिकोड में जवाब आसानी से नहीं दिया जाता है। समस्या, जैसा कि आपने पहले ही बताया है, एन्कोडिंग हैं।
अक्षरों के पात्रों के बिना किसी भी अंग्रेजी वाक्य को देखते हुए, यूटीएफ -8 का उत्तर वर्णों के रूप में कई बाइट होगा और यूटीएफ -16 के लिए यह वर्णों की संख्या दो बार होगा।
एकमात्र एन्कोडिंग जहां (अभी तक) हम आकार के बारे में बयान यूटीएफ -32 है। वहां प्रति चरित्र 32 बिट हमेशा होता है, भले ही मुझे लगता है कि भविष्य के यूटीएफ -64 के लिए कोड पॉइंट तैयार किए गए हैं :)
कम से कम दो चीजें कितनी मुश्किल होती हैं:
- रचना वर्ण, जहां चरित्र इकाई का उपयोग करने के बजाय पहले से ही उच्चारण / diacritic (À) है, एक उपयोगकर्ता ने उच्चारण और आधार चरित्र (`ए) गठबंधन करने का फैसला किया।
- कोड अंक कोड पॉइंट वह तरीका है जिसके द्वारा यूटीएफ-एन्कोडिंग बिट्स की संख्या से अधिक एन्कोड करने की अनुमति देती है जो उन्हें अपना नाम आमतौर पर अनुमति देती है। जैसे यूटीएफ -8 कुछ बाइट्स को निर्दिष्ट करता है जो स्वयं पर अमान्य हैं, लेकिन जब वैध निरंतर बाइट के बाद 0.0155 की 8-बिट सीमा से परे किसी वर्ण का वर्णन करने की अनुमति मिलती है। यूटीएफ -8 पर विकिपीडिया आलेख में नीचे दिए गए Examples और ओवरलैंग एनकोडिंग देखें।
- वहां दिया गया उत्कृष्ट उदाहरण यह है कि € वर्ण (कोड पॉइंट
U+20AC
E2 82 AC
या तो तीन-बाइट अनुक्रमE2 82 AC
या चार-बाइट अनुक्रमF0 82 82 AC
। - दोनों मान्य हैं, और इससे पता चलता है कि "यूनिकोड" के बारे में बात करते समय और यूटीएफ -8 या यूटीएफ -16 जैसे यूनिकोड के विशिष्ट एन्कोडिंग के बारे में बात करते समय जवाब कितना जटिल होता है।
- वहां दिया गया उत्कृष्ट उदाहरण यह है कि € वर्ण (कोड पॉइंट