यह भी देखें कि चीनी पात्रों के साथ एक फ़ाइल कैसे पता करती है कि प्रति चरित्र कितने बाइट्स का उपयोग करना है? - इसमें कोई संदेह नहीं है, अन्य एसओ प्रश्न हैं जो भी मदद करेंगे।
UTF-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
(अंतिम पंक्ति ऐसा लगता है जैसे इसे 0xF0..0xF7 पढ़ना चाहिए; हालाँकि, यूनिकोड की 21-बिट श्रेणी (U + 0000 - U + 10FFFF) का अर्थ है कि अधिकतम वैध मान 0xF4 है; मान xxF5..0xF7 में नहीं हो सकता है। वैध UTF-8)
यह देखने के लिए कि क्या बाइट्स का एक विशेष क्रम UTF-8 मान्य है, जिसके बारे में आपको सोचने की आवश्यकता है:
- निरंतर बाइट्स जहां अपेक्षित नहीं हैं
- गैर-निरंतरता बाइट्स जहां एक निरंतरता बाइट अपेक्षित है, दिखाई दे रही है
- स्ट्रिंग के अंत में अपूर्ण पात्र ('निरंतर बाइट अपेक्षित' की विविधता)
- गैर-न्यूनतम अनुक्रम
- यूटीएफ -16 सरोगेट
मान्य UTF-8 में, बाइट्स 0xF5..0xFF नहीं हो सकता है।
गैर-न्यूनतम अनुक्रम
कुछ पात्रों के लिए कई संभावित प्रतिनिधित्व हैं। उदाहरण के लिए, यूनिकोड वर्ण U + 0000 (ASCII NUL) को इसके द्वारा दर्शाया जा सकता है:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
हालांकि, यूनिकोड मानक स्पष्ट रूप से बताता है कि अंतिम तीन विकल्प स्वीकार्य नहीं हैं क्योंकि वे न्यूनतम नहीं हैं। ऐसा होता है कि बाइट्स 0xC0 और 0xC1 वैध यूटीएफ -8 में कभी नहीं दिखाई दे सकते हैं क्योंकि केवल उन वर्णों को एनकोड किया जा सकता है जो कि 0x00..0x7F में एकल बाइट वर्णों के रूप में न्यूनतम रूप से एन्कोड किए गए हैं।
यूटीएफ -16 सरोगेट
बेसिक मल्टी-लिंगुअल प्लेन (BMP) के भीतर, यूनिकोड मान U + D800 - U + DFFF UTF-16 सरोगेट के लिए आरक्षित हैं और मान्य UTF-8 में एन्कोडेड नहीं दिखाई दे सकते। यदि वे UTF-8 में मान्य थे (जो, मैं जोर देता हूं, वे नहीं हैं), तो सरोगेट को एन्कोड किया जाएगा:
- U + D800 - 0xED 0xA0 0x80 (सबसे छोटा उच्च सरोगेट)
- U + DBFF - 0xED 0xAF 0xBF (सबसे बड़ा उच्च सरोगेट)
- U + DC00 - 0xED 0xB0 0x80 (सबसे छोटा कम किराए)
- U + DFFF - 0xED 0xBF 0xBF (सबसे बड़ा निम्न सरोगेट)
खराब डेटा
तो, आपके BAD डेटा में इन विभिन्न नुस्खों का उल्लंघन करने वाले नमूने होने चाहिए।
- प्रारंभिक बाइट मूल्यों में से एक से पहले जारी नहीं बाइट
- बहु चरित्र प्रारंभिक बाइट्स पर्याप्त निरंतर बाइट्स द्वारा पीछा नहीं किया
- गैर-न्यूनतम बहु-बाइट वर्ण
- यूटीएफ -16 सरोगेट
- अमान्य बाइट्स (0xC0, 0xC1, 0xF5..0xFF)।
ध्यान दें कि एक बाइट-ऑर्डर मार्क (BOM) U + FEFF, उर्फ शून्य-चौड़ाई नो-ब्रेक स्पेस (ZWNBSP), UTF-8 में अनएन्कोडेड नहीं दिखाई दे सकता है - बाइट्स 0xFF और 0xFE को मान्य UTF-8 में अनुमति नहीं है। एक एन्कोडेड ZWNBSP UTF-8 फाइल में 0xEF 0xBB 0xBF के रूप में दिखाई दे सकता है, लेकिन BOM UTF-8 में पूरी तरह से अति विशिष्ट है।
यूनिकोड में कुछ नॉनचैकर भी हैं । U + FFFE और U + FFFF दो ऐसे नॉनचैकर हैं (और प्रत्येक विमान में अंतिम दो कोड पॉइंट हैं, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, U + 10FFFE, U + 10FFFF अन्य हैं) )। ये आम तौर पर डेटा एक्सचेंज के लिए यूनिकोड डेटा में नहीं दिखना चाहिए, लेकिन निजी उपयोग में दिखाई दे सकता है। यूनिकोड में गैर-अंशधारकों के बजाय जटिल इतिहास सहित बहुत सारे विवरणों के लिए यूनिकोड FAQ लिंक देखें। ( कोरिगेन्डम # 9: क्लेरिफिकेशन अबाउट नॉनचैकर , जो जनवरी 2013 में जारी किया गया था, इसका शीर्षक वही बताता है - जो गैर-पात्रों के अर्थ को स्पष्ट करता है।)