एक यूनिकोड प्रहरी मूल्य मैं उपयोग कर सकते हैं?


14

मैं एक फाइल फॉर्मेट को छोड़ रहा हूं और मैं इसे सही करना चाहता हूं। चूंकि यह एक बाइनरी स्वरूप है, फ़ाइल के पहले बाइट (या बाइट्स) चाहिए नहीं वैध शाब्दिक पात्रों के रूप में (सिर्फ PNG फ़ाइल शीर्षक में की तरह 1 )। यह उन टूल को अनुमति देता है जो प्रारूप को नहीं पहचानते हैं फिर भी यह देखते हैं कि इसकी टेक्स्ट फाइल पहले कुछ बाइट्स को देखकर नहीं है।

ऊपर दिया गया कोई भी कोडपॉइंट 0x7FUS-ASCII अमान्य है, इसलिए यह आसान है। लेकिन यूनिकोड के लिए यह एक अलग कहानी है। मान्य यूनिकोड वर्णों के अलावा, निजी-उपयोग वाले वर्ण , गैर - प्रेषक और प्रहरी हैं , जैसा कि मैंने यूनिकोड निजी-उपयोग वर्ण, गैर-अक्षर और प्रहरी में पाया ।

बाइट्स का एक प्रहरी क्रम क्या होगा जिसे मैं उस फ़ाइल के प्रारंभ में उपयोग कर सकता हूं जिसके परिणामस्वरूप अमान्य US-ASCII, UTF-8, UTF-16LE और UTF-16BE होंगे?

  • स्पष्ट रूप से पहले बाइट का मूल्य नीचे नहीं हो सकता है 0x80क्योंकि यह एक वैध यूएस-एएससीआईआई (नियंत्रण) चरित्र होगा, इसलिए 0x00इसका उपयोग नहीं किया जा सकता है।
  • साथ ही, चूंकि निजी-उपयोग वाले पात्र यूनिकोड वर्ण हैं, इसलिए मैं उन कोडपॉइंट का उपयोग नहीं कर सकता।
  • के बाद से इसके साथ काम करना चाहिए दोनों छोटे-endian और बड़े endian UTF-16, एक noncharacter जैसे 0xFFFEभी संभव नहीं है के रूप में अपनी रिवर्स 0xFEFFएक वैध यूनिकोड वर्ण है।
  • उपर्युक्त अक्सर पूछे जाने वाले प्रश्न किसी भी गैर-लाभार्थी का उपयोग नहीं करने का सुझाव देते हैं, जिसके परिणामस्वरूप अभी भी एक वैध यूनिकोड अनुक्रम होगा, इसलिए ऐसा कुछ 0xFFFFचित्र से बाहर भी है।

भविष्य के प्रूफ प्रहरी मूल्य क्या होंगे जो मेरे उपयोग के लिए बचे हैं?


1 ) पीएनजी प्रारूप में गैर-एएससीआईआई 0x89मूल्य के पहले बाइट के रूप में है , इसके बाद स्ट्रिंग है PNG। पीएनजी के पहले कुछ बाइट्स को पढ़ने वाला एक उपकरण यह निर्धारित कर सकता है कि यह एक द्विआधारी फ़ाइल है क्योंकि यह व्याख्या नहीं कर सकता है 0x89। दूसरी ओर, एक GIF फ़ाइल, सीधे मान्य और पठनीय ASCII स्ट्रिंग के साथ शुरू होती है और GIFउसके बाद तीन और मान्य ASCII वर्ण होते हैं। GIF के लिए एक उपकरण यह निर्धारित कर सकता है कि यह एक पठनीय पाठ फ़ाइल है। यह गलत है और एक गैर-पाठीय बाइट अनुक्रम के साथ फाइल शुरू करने का विचार एंडी मैकफर्डन द्वारा डिजाइनिंग फ़ाइल स्वरूपों से आया है ।


3
Since it is a binary format, the first bytes of the file should not form valid textual characters- आपको मैजिक फाइल (/ usr / share / मैजिक, या / etc / मैजिक को कई यूनिक्स सिस्टम) पर देखना चाहिए जो दिखाता है कि यह एप्लिकेशन फ़ाइल प्रकारों की पहचान कैसे करता है। एक PNG फ़ाइल के साथ शुरू होता है \x89PNG\x0d\0a\x1a\x0a- वहाँ "PNG" पर ध्यान दें, यह एक कच्चा स्ट्रिंग है। अनुक्रम \x89और पसंद गैर-प्रिंट करने योग्य बाइट्स हैं।

@ मिचेल्ट हाँ, चूंकि पीएनजी एक द्विआधारी प्रारूप है, पहला बाइट एक मान्य पाठ्य चरित्र नहीं बनाता है। मेरा मतलब यही था। मैं आपकी बात को देखने में असफल हूं?
डेनियल एए पल्सेमेकर

7
वह एक उदाहरण था। A .gif के साथ शुरू होता है GIF8। एक SGI movi फ़ाइल के साथ शुरू होता है MOVI। ज़िप संग्रह फ़ाइल की एक शैली के साथ शुरू होता है ZZ, और अधिक लोकप्रिय pkzip प्रारूप के साथ शुरू होता है PK। बाधा है कि पहली बाइट एक अमान्य पाठ चरित्र है जो जंगली में पाया जाता है से मेल नहीं खाती है। मैं उत्सुक हूं कि यह एक आवश्यकता क्यों है।

3
क्या आप वास्तव में परवाह करते हैं कि जब वे एक अज्ञात फ़ाइल देखते हैं तो अन्य कार्यक्रम कैसे व्यवहार करते हैं? मेरे लिए, एक हस्ताक्षर अनुक्रम (पीएनजी फाइलों की तरह) एक प्रहरी अनुक्रम की तुलना में बहुत अधिक उपयोगी है - जब सामग्री को एक सरल स्ट्रीम प्रोटोकॉल के माध्यम से भेजा जाता है, तो रिसीवर तुरंत तय कर सकता है कि निम्नलिखित बाइट्स को कैसे संभालना है। एक ओमानी-प्रहरी अनुक्रम किसी भी क्रम के बगल में नहीं है एक बार हर कोई अपने स्वयं के प्रारूप की पहचान करने के लिए इसका उपयोग करना शुरू कर देता है।
कोडिज्म

2
@Virtlink, मुझे विशेष रूप से परवाह नहीं है कि आप अपनी फ़ाइल प्रारूप में किन बाइट्स का उपयोग करते हैं। लेकिन आपने यह दावा किया कि एससीआई पात्रों का उपयोग करने के लिए इसका 'गलत' ... फिर भी मैंने यहां ऐसा कुछ भी नहीं देखा है जो उस दावे का समर्थन करता हो, और अनुभवजन्य अनुभव का बहुत कुछ है जो दिखाता है कि यह वास्तव में कोई फर्क नहीं पड़ता (अर्थात, अनगिनत फ़ाइल ऐसे प्रारूप जो दशकों से बिना किसी समस्या के ASCII वर्णों का उपयोग कर रहे हैं)
ग्रैंडमास्टरबी

जवाबों:


16

0xDC 0xDC

  • स्पष्ट रूप से अमान्य UTF-8 और ASCII
  • UTF-16 में धीरज की परवाह किए बिना नेतृत्व की स्थिति में अनियंत्रित निशान सरोगेट। इससे अधिक अमान्य UTF-16 नहीं मिलता है।

लेकिन पूरी तरह से उचित ISO-8859-1, और संभवतः किसी अन्य वर्ण सेट में उचित है जो 8-बिट एन्कोडिंग का उपयोग करता है।
Parsifal

4
+1 OP ने ISO 8859-1, केवल US-ASCII और UTF- * के लिए नहीं पूछा।
रॉस पैटरसन

@RossPatterson - सच है, लेकिन मुझे संदेह है कि ज्यादातर इसलिए है क्योंकि ओपी ने वास्तव में समस्या के बारे में नहीं सोचा है। किसी भी आँकड़े के बिना मुझे बैक अप करने के लिए, मैं शर्त लगाने को तैयार हूँ कि एक यादृच्छिक "यह पाठ है" एल्गोरिथ्म UTF-16 की तुलना में ISO-8859-1 को वरीयता देने की अधिक संभावना है, केवल इसलिए कि 8-बिट की एक विशाल राशि है दुनिया में पाठ।
पारसीफाल

3
@parsifal कोई भी बाइनरी मान्य ISO-8859-1 है, इसलिए इसे केवल इसलिए विचार करने की आवश्यकता नहीं है क्योंकि अमान्य ISO-8859-1 को बनाना असंभव है।
एस्लेइजा

1
@parsifal सच है और यदि वह आवश्यकता थी तो आप बस 0x00या जो भी उपयोग कर सकते थे , लेकिन op ऐसा नहीं चाहता था।
१४:४३ पर एस्लेइजा

5
  • UTF-8 में, बाइट्स C0, C1 और F5 - FF अवैध हैं। पहला बाइट या तो ASCII होना चाहिए या C2-F4 रेंज में एक बाइट होना चाहिए, कोई भी अन्य बाइट शुरू होने वाला UTF-8 मान्य नहीं है।

  • UTF-16 में, फ़ाइल सामान्य रूप से बाइट ऑर्डर मार्क (U + FEFF) के साथ शुरू होती है, अन्यथा अनुप्रयोगों को बाइट ऑर्डर पर अनुमान लगाना पड़ता है। D800-DBFF रेंज में कोडपॉइंट्स सरोगेट पेयर के लिए लीड बाइट्स हैं, और DC00-DFFF सरोगेट पेयर के लिए ट्रेलिंग बाइट्स हैं।

इस प्रकार, मैं बाइट कॉम्बो का उपयोग करूँगा F5DC। ये दो मूल्य हैं:

  • ASCII नहीं
  • मान्य UTF-8 नहीं
  • या तो एक सरोगेट जोड़ी (कानूनी नहीं) में एक UTF-16 अनुगामी बाइट के रूप में व्याख्या की गई है, या कोडपॉइंट U + F5DC, जो कि एक निजी उपयोग का चरित्र है, लेकिन केवल उन अनुप्रयोगों द्वारा जो बिना किसी BOM के भी UTF-16 की व्याख्या करने का प्रयास करते हैं ।

आप की जरूरत है और अधिक विकल्प, F5DDके माध्यम से F5DFसभी के रूप में करते हैं, एक ही 3 गुण होते हैं F6DC- F6DF, F7DC- F7DFऔर F8DC- F8DF, 16 अलग अलग बाइट कॉम्बो के लिए कुल से लेने के लिए।


तो, Esailija द्वारा U + DCDC का उपयोग करने के सुझाव से, 0xDCUTF-8 मान्य होगा?
डैनियल एए Pelsmaeker

2
@Virtlink 0xDC2-बाइट अनुक्रम के लिए UTF-8 लीड बाइट है। यह 10xxxxxxमान्य होने के लिए इसे एक निरंतर बाइट द्वारा पालन किया जाना चाहिए । 0xDCएक वैध निरंतरता बाइट 0xDC 0xDCनहीं है , इसलिए UTF-8 मान्य नहीं है।
एस्लेइजा

@Virtlink: नहीं, क्योंकि दूसरा बाइट मान्य नहीं है, यह सीमा में होना होगा 80- BF
मार्टिज़न पीटरर्स

2

यदि आप "टेक्स्ट नहीं" इंगित करने के लिए एक गैर-मुद्रण योग्य वर्ण का उपयोग करने की कोशिश कर रहे हैं, तो आपको 0x89 को हराना मुश्किल होगा:

  • यह US-ASCII रेंज के बाहर है
  • ISO-8859-1 में यह एक गैर-मुद्रण योग्य चरित्र है ("अनुकूलन के साथ चार्टेरेशन")। इसी तरह Shift-JIS, जिसके बारे में मेरा मानना ​​है कि यह अभी भी आम उपयोग में है। अन्य 8-बिट एन्कोडिंग, हालांकि इसे एक वैध चरित्र के रूप में मानते हैं।
  • UTF-8 में यह बहु-बाइट अनुक्रम के लिए एक अमान्य प्रथम-बाइट (शीर्ष बिट्स 10 हैं, जो वर्णों के लिए आरक्षित हैं। बहु-बाइट अनुक्रम के 2.N)

आमतौर पर, जब आप जादू नंबर बनाते हैं, तो "गैर-पाठ" एक मामूली बिंदु होता है। मुझे संदर्भ देखना होगा, लेकिन मानक ग्राफिक्स प्रारूपों में से एक (टीआईएफएफ, मुझे लगता है) में इसके जादू नंबर से उपयोगी जानकारी के छह अलग-अलग टुकड़े हैं।

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