C99 या पहले का
C मानक (C99) विस्तृत वर्णों और मल्टी-बाइट वर्णों के लिए प्रदान करता है, लेकिन चूंकि उन विस्तृत वर्णों के बारे में कोई गारंटी नहीं है, इसलिए उनका मान कुछ सीमित है। किसी दिए गए कार्यान्वयन के लिए, वे उपयोगी सहायता प्रदान करते हैं, लेकिन यदि आपका कोड कार्यान्वयन के बीच स्थानांतरित करने में सक्षम होना चाहिए, तो अपर्याप्त गारंटी है कि वे उपयोगी होंगे।
नतीजतन, हंस वैन एके द्वारा सुझाए गए दृष्टिकोण (जो आईसीयू के चारों ओर एक आवरण लिखने के लिए है - यूनिकोड के लिए अंतर्राष्ट्रीय घटक - पुस्तकालय) ध्वनि, आईएमओ है।
UTF-8 एन्कोडिंग के कई गुण हैं, जिनमें से एक यह है कि यदि आप डेटा के साथ गड़बड़ नहीं करते हैं (उदाहरण के लिए इसे काटकर), तो इसे उन कार्यों द्वारा कॉपी किया जा सकता है जो UTF-8 की पेचीदगियों से पूरी तरह अवगत नहीं हैं एन्कोडिंग। यह स्पष्ट रूप से ऐसा नहीं है wchar_t
।
पूर्ण में यूनिकोड एक 21-बिट प्रारूप है। यही है, यूनिकोड कोड यू + 0000 से यू + 10 एफएफएफ के लिए आरक्षित करता है।
UTF-8, UTF-16 और UTF-32 स्वरूपों के बारे में उपयोगी चीजों में से एक (जहाँ UTF यूनिकोड परिवर्तन प्रारूप के लिए खड़ा है - यूनिकोड देखें ) यह है कि आप सूचना के नुकसान के बिना तीन अभ्यावेदन के बीच परिवर्तित कर सकते हैं। प्रत्येक का प्रतिनिधित्व कर सकते हैं कुछ भी दूसरों का प्रतिनिधित्व कर सकते हैं। UTF-8 और UTF-16 दोनों बहु-बाइट स्वरूप हैं।
UTF-8 एक बहु-बाइट प्रारूप के रूप में जाना जाता है, एक सावधान संरचना के साथ जो स्ट्रिंग में किसी भी बिंदु पर शुरू करते हुए, एक स्ट्रिंग में पात्रों की शुरुआत को खोजने के लिए संभव बनाता है। एकल-बाइट वर्णों में उच्च-बिट सेट शून्य होता है। मल्टी-बाइट वर्णों में पहला चरित्र एक बिट पैटर्न 110, 1110 या 11110 (2-बाइट, 3-बाइट या 4-बाइट वर्णों के साथ) के साथ शुरू होता है, बाद के बाइट्स हमेशा 10. के साथ शुरू होते हैं। निरंतरता वर्ण हमेशा होते हैं रेंज 0x80 .. 0xBF। ऐसे नियम हैं जो न्यूनतम संभव प्रारूप में UTF-8 वर्णों का प्रतिनिधित्व करते हैं। इन नियमों का एक परिणाम यह है कि बाइट्स 0xC0 और 0xC1 (भी 0xF5..0xFF) मान्य UTF-8 डेटा में प्रकट नहीं हो सकते हैं।
U+0000 .. U+007F 1 byte 0xxx xxxx
U+0080 .. U+07FF 2 bytes 110x xxxx 10xx xxxx
U+0800 .. U+FFFF 3 bytes 1110 xxxx 10xx xxxx 10xx xxxx
U+10000 .. U+10FFFF 4 bytes 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
मूल रूप से, यह आशा की गई थी कि यूनिकोड एक 16-बिट कोड सेट होगा और सब कुछ 16-बिट कोड स्थान में फिट होगा। दुर्भाग्य से, वास्तविक दुनिया अधिक जटिल है, और इसे वर्तमान 21-बिट एन्कोडिंग तक विस्तारित किया जाना था।
UTF-16 इस प्रकार 'बेसिक बहुभाषी विमान' के लिए एक एकल इकाई (16-बिट शब्द) कोड सेट है, जिसका अर्थ है यूनिकोड कोड अंक U + 0000 .. U + FFFF के साथ वर्ण, लेकिन दो इकाइयों (32-बिट) का उपयोग करता है इस सीमा के बाहर वर्ण। इस प्रकार, यूटीएफ -16 एन्कोडिंग के साथ काम करने वाले कोड को यूटीएफ -8 की तरह ही चर चौड़ाई के एन्कोडिंग को संभालने में सक्षम होना चाहिए। डबल-यूनिट वर्णों के लिए कोड को सरोगेट कहा जाता है।
यूआरएफ -16 में युग्मित कोड इकाइयों के अग्रणी और अनुगामी मूल्यों के रूप में उपयोग के लिए आरक्षित यूनिकोड मूल्यों की दो विशेष श्रेणियों से सरोगेट्स कोड पॉइंट हैं। अग्रणी, जिन्हें उच्च भी कहा जाता है, सरोगेट U + D800 से U + DBFF तक हैं, और अनुगामी, या निम्न, सरोगेट U + DC00 से U + DFFF तक हैं। उन्हें सरोगेट कहा जाता है, क्योंकि वे सीधे पात्रों का प्रतिनिधित्व नहीं करते हैं, लेकिन केवल एक जोड़ी के रूप में।
बेशक, UTF-32, स्टोरेज की एक इकाई में किसी भी यूनिकोड कोड बिंदु को एनकोड कर सकता है। यह संगणना के लिए कुशल है लेकिन भंडारण के लिए नहीं।
आप ICU और यूनिकोड वेब साइटों पर बहुत अधिक जानकारी पा सकते हैं ।
C11 और <uchar.h>
C11 मानक ने नियमों को बदल दिया, लेकिन सभी कार्यान्वयन अभी भी बदलावों के साथ नहीं पकड़े गए हैं (2017 के मध्य)। C11 मानक यूनिकोड समर्थन के लिए परिवर्तनों का सारांश प्रस्तुत करता है:
- यूनिकोड वर्ण और तार (
<uchar.h>
) (मूल रूप से ISO / IEC TR 19769: 2004 में निर्दिष्ट)
इस प्रकार की कार्यक्षमता की एक न्यूनतम न्यूनतम रूपरेखा है। विनिर्देश में शामिल हैं:
6.4.3 सार्वभौमिक चरित्र नाम
सिंटेक्स
यूनिवर्सल-कैरेक्टर-नाम:
\u
हेक्स-क्वाड
\U
हेक्स-क्वाड हेक्स-क्वाड
हेक्स-क्वाड:
हेक्साडेसिमल-डिजिट हेक्साडेसिमल-डिजिट हेक्साडेसिमल-डिजिट हेक्साडेसिमल-डिजिट
7.28 यूनिकोड उपयोगिताओं <uchar.h>
शीर्ष लेख <uchar.h>
यूनिकोड वर्णों में हेरफेर करने के लिए प्रकारों और कार्यों की घोषणा करता है।
घोषित प्रकार mbstate_t
(7.29.1 में वर्णित हैं ) और size_t
(7.19 में वर्णित);
char16_t
जो 16-बिट वर्णों के लिए उपयोग किया गया एक अहस्ताक्षरित पूर्णांक प्रकार है और उसी प्रकार है जैसा uint_least16_t
(7.20.1.2 में वर्णित है); तथा
char32_t
जो 32-बिट वर्णों के लिए उपयोग किया गया एक अहस्ताक्षरित पूर्णांक प्रकार है और यह उसी प्रकार है जैसे uint_least32_t
(7.20.1.2 में वर्णित है)।
(अनुवाद कर रहा है पार संदर्भ: <stddef.h>
परिभाषित करता है size_t
,
<wchar.h>
परिभाषित करता है mbstate_t
, और <stdint.h>
परिभाषित करता है uint_least16_t
और uint_least32_t
।) <uchar.h>
हैडर भी (restartable) रूपांतरण कार्यों का एक न्यूनतम सेट को परिभाषित करता है:
mbrtoc16()
c16rtomb()
mbrtoc32()
c32rtomb()
ऐसे नियम हैं जिनके बारे में यूनिकोड वर्णों का उपयोग पहचानकर्ताओं में \unnnn
या \U00nnnnnn
नोटेशन का उपयोग करके किया जा सकता है। आपको पहचानकर्ताओं में ऐसे पात्रों के समर्थन को सक्रिय रूप से सक्रिय करना पड़ सकता है। उदाहरण के लिए, जीसीसी को -fextended-identifiers
पहचानकर्ताओं में इन्हें अनुमति देने की आवश्यकता होती है।
ध्यान दें कि macOS Sierra (10.12.5), नाम के लिए लेकिन एक प्लेटफॉर्म का समर्थन नहीं करता है <uchar.h>
।