2012-03-02 6 views
54

एक यूटीएफ -8 एन्कोडेड चरित्र के लिए बाइट्स की अधिकतम संख्या क्या है?यूटीएफ -8 एन्कोडेड चरित्र के लिए बाइट्स की अधिकतम संख्या क्या है?

मैं यूटीएफ -8 में एन्कोड किए गए स्ट्रिंग के बाइट्स को एन्क्रिप्ट कर दूंगा और इसलिए यूटीएफ -8 एन्कोडेड स्ट्रिंग के लिए अधिकतम बाइट्स को काम करने में सक्षम होना चाहिए।

कोई एक भी UTF-8 एन्कोडेड चरित्र के लिए बाइट्स की अधिकतम संख्या की पुष्टि कर सके कृपया

+1

आपने * विकिपीडिया के यूटीएफ -8 आलेख] (http://en.wikipedia.org/wiki/UTF-8) जैसे सामान्य संसाधनों को देखा, पहले ... सही? –

+3

मैंने कई लेख पढ़े जो मिश्रित उत्तरों दिए ... मुझे वास्तव में इंप्रेशन मिला कि उत्तर 3 था इसलिए मुझे बहुत खुशी है कि मैंने – Edd

+1

से पूछा कि मैं यहां एक यूट्यूब लिंक छोड़ दूंगा, जिसमें टॉम स्कॉट के पात्र, प्रतीक, यूनिकोड चमत्कार शामिल हैं: https: //goo.gl/sUr1Hf। आप सुनते हैं और देखते हैं कि ASCII वर्ण एन्कोडिंग से utf-8 तक सबकुछ कैसे विकसित किया जा रहा है। – Roylee

उत्तर

61

चरित्र प्रति बाइट्स की अधिकतम संख्या 4 है RFC3629 जो U+10FFFF के चरित्र तालिका सीमित के अनुसार:

यूटीएफ -8 में, यू +0000..यू + 10 एफएफएफएफ रेंज (यूटीएफ -16 सुलभ रेंज) के पात्र 1 से 4 ऑक्टेट्स के अनुक्रमों का उपयोग करके एन्कोड किए गए हैं।

एक कोड कम से कम 128 के साथ (मूल विनिर्देश अतीत U+10FFFF कोड अंक के लिए छह बाइट के लिए चरित्र कोड के लिए अनुमति दी।)

वर्ण केवल 1 बाइट की आवश्यकता होगी, और अगले 1920 चरित्र कोड 2 की आवश्यकता होती है केवल बाइट्स। जब तक आप एक गूढ़ भाषा के साथ काम नहीं कर रहे हैं, तब तक चरित्र गणना को 4 से गुणा करना एक महत्वपूर्ण अतिवृद्धि होगी।

+2

आपके लिए "एथोथिक भाषा" क्या है? कोई भी भाषा जो असली दुनिया में मौजूद होगी, या एक पाठ जो दुनिया की विभिन्न भाषाओं के बीच स्विच करता है? क्या यूटीएफ -8-टू-स्ट्रिंग फ़ंक्शन का डेवलपर मल्टीप्लिकेटर के रूप में 2, 3 या 4 का चयन करना चाहिए यदि वह अधिक आवंटन करता है और वास्तविक रूपांतरण के बाद परिणाम को घटा देता है? –

+1

@ गूंजटेक 'गूढ़ भाषा' द्वारा उसका अर्थ है एक ऐसी भाषा जिसमें बहुत अधिक मूल्य वाले यूनिकोड वर्ण हैं (इस सूची के नीचे से कुछ: http://unicode-table.com/en/sections/)। यदि आपको अधिक आवंटित करना होगा, तो 4 चुनें। आप एक डबल पास कर सकते हैं, यह देखने के लिए कि आपको कितने बाइट्स की आवश्यकता होगी और आवंटित करें, फिर दूसरा एन्कोडिंग करें; यह ~ 4 गुना रैम आवंटित करने से बेहतर हो सकता है। – matiu

+4

हमेशा खराब केस को संभालने का प्रयास करें: http://www.hacker9.com/single-message-can-crash-whatsapp.html –

22
आगे संदर्भ के बिना

, मैं कहूंगा कि UTF-8 में एक चरित्र के लिए बाइट्स की अधिकतम संख्या

जवाब है कि: 6 बाइट्स

स्वीकार किए जाते हैं जवाब के लेखक सही ढंग से यह पता के रूप में कहा कि " मूल विनिर्देश ", लेकिन मुझे लगता है कि यह पाठक को गुमराह करता है, क्योंकि जहां तक ​​मुझे पता है, यह अभी भी वर्तमान और सही विनिर्देश है, प्रति wikipedia, और a Google book on UTF-8 in Java प्रति।

आरएफसी स्वीकार किए जाते हैं जवाब कहा गया है कि केवल चार बाइट्स एक UTF-16 एन्कोडिंग के लिए प्रासंगिक हैं में संदर्भित है, तो यह सही है कि हम संदर्भ

जवाब केवल तभी जब यदि UTF-16 से केवल अक्षर का अनुवाद UTF- को 8: 4 बाइट्स

अब, क्या वे सभी पात्र हैं जिन्हें यूटीएफ -16 द्वारा समर्थित किया जा सकता है? wikipedia again के अनुसार, यूनिकोड x10FFFF कोड बिंदुओं का प्रतिनिधित्व कर सकता है। तो, 0 सहित, इसका मतलब है कि हम इन बाइट्स के साथ ऐसा कर सकते हैं: एफ एफएफ एफएफ, यानी ढाई बाइट, या 20 बिट्स। यूटीएफ -8 स्पेक पर वापस देखकर, हम देखते हैं कि हम चार यूटीएफ -8-एन्कोडेड बाइट्स के साथ 20 बिट्स का प्रतिनिधित्व कर सकते हैं। तो

जवाब सभी यूनिकोड को कवर करता है, तो: Java <= v7 में, 4 बाइट

लेकिन, वे UTF-8 के साथ यूनिकोड का प्रतिनिधित्व करने के लिए एक 3-बाइट अधिकतम के बारे में बात? ऐसा इसलिए है क्योंकि मूल यूनिकोड विनिर्देश ने केवल मूल बहुभाषी विमान (BMP) को परिभाषित किया है, यानी यह यूनिकोड का पुराना संस्करण है, या आधुनिक यूनिकोड का सबसेट है। तो

जवाब केवल मूल यूनिकोड, बीएमपी का प्रतिनिधित्व करता है, तो: 3 बाइट्स

लेकिन, दूसरी तरह के जाने के बारे में ओपी बात करती है। वर्णों से यूटीएफ -8 बाइट्स तक नहीं, लेकिन यूटीएफ -8 बाइट्स से बाइट्स प्रतिनिधित्व के "स्ट्रिंग" तक। शायद स्वीकार्य उत्तर के लेखक ने सवाल के संदर्भ से पाया, लेकिन यह जरूरी नहीं है, इसलिए इस प्रश्न के आकस्मिक पाठक को भ्रमित कर सकते हैं।

यूटीएफ -8 से देशी एन्कोडिंग में जाकर, हमें यह देखना होगा कि "स्ट्रिंग" कैसे कार्यान्वित किया जाता है। पाइथन> = 3 जैसी कुछ भाषाएं प्रत्येक वर्ण को पूर्णांक कोड बिंदुओं के साथ प्रस्तुत करती हैं, जो कि कुछ कचरे के साथ यूनिकोड की आवश्यकता वाले 20 को कवर करने के लिए प्रति वर्ण 4 बाइट्स की अनुमति देती है। बिल्कुल 20 बिट क्यों नहीं? क्योंकि चीजें तेजी से होती हैं जब वे बाइट-गठबंधन होते हैं। पाइथन < = 2 और Java जैसी कुछ भाषाएं यूटीएफ -16 एन्कोडिंग का उपयोग करके वर्णों का प्रतिनिधित्व करती हैं, जिसका अर्थ है कि उन्हें विस्तारित यूनिकोड (बीएमपी नहीं) का प्रतिनिधित्व करने के लिए सरोगेट जोड़े का उपयोग करना होगा। किसी भी तरह से अभी भी 4 बाइट अधिकतम है। यदि

जवाब UTF-8 के लिए जा रहा -> देशी एन्कोडिंग: 4 बाइट्स

तो, अंतिम निष्कर्ष, 4 सबसे आम सही जवाब है, इसलिए हम इसे अधिकार मिल गया। लेकिन, कुछ संदर्भों में आपको सावधान रहना चाहिए। उदाहरण के लिए, उम्मीद न करें कि आप जो कुछ भी यूटीएफ -8 स्ट्रीम से अधिकतम 4 बाइट में पढ़ते हैं उसका प्रतिनिधित्व कर सकते हैं। यदि यह यूनिकोड नहीं है, तो आपको 6 बाइट्स की आवश्यकता हो सकती है।

+1

"यह अभी भी वर्तमान और सही विनिर्देश है, प्रति विकिपीडिया" - अब और नहीं। इसे लिखने के कुछ ही समय बाद (अप्रैल 2 संपादन), विकिपीडिया के यूटीएफ -8 लेख को यह स्पष्ट करने के लिए बदला गया था कि 6-ऑक्टेट संस्करण वर्तमान (2003) यूटीएफ -8 स्पेक का हिस्सा नहीं है। –

+0

"लेकिन, जावा में <= v7, वे यूटीएफ -8 के साथ यूनिकोड का प्रतिनिधित्व करने के लिए अधिकतम 3-बाइट अधिकतम बात करते हैं? ऐसा इसलिए है क्योंकि मूल यूनिकोड विनिर्देश ने केवल मूल बहुभाषी विमान को परिभाषित किया है" - शायद यह मूल कारण है, लेकिन यह पूरी कहानी नहीं है। जावा "संशोधित यूटीएफ -8" का उपयोग करता है, और संशोधनों में से एक यह है कि यह "मानक यूटीएफ -8 के चार-बाइट प्रारूप" (उनके शब्दों) के बजाय "अपने दो-बार-तीन-बाइट प्रारूप का उपयोग करता है"। –

+0

10FFFF (केवल एक मिलियन से अधिक) सीमा से ऊपर आवंटित कोई कोडपॉइंट नहीं हैं और कई यूटीएफ 8 कार्यान्वयनों ने 4 बाइट्स (और कुछ केवल 3, उदाहरण के लिए MySQL) से अधिक अनुक्रमों को लागू नहीं किया है, इसलिए मैं इसे 4 बाइटों तक हार्ड सीमा तक सुरक्षित मानूंगा पुराने कार्यान्वयन के साथ संगतता पर विचार करते समय भी प्रति कोडपॉइंट। आपको बस यह सुनिश्चित करने की आवश्यकता होगी कि आप जिस तरह से अमान्य कुछ भी छोड़ दें। ध्यान दें कि सटीक बाइट लंबाई की गणना करने के बाद आवंटन की मातियू की सिफारिश एक अच्छा है जहां संभव हो। – thomasrutter

संबंधित मुद्दे