6

ऐसा लगता है वहाँ बाइट आदेश मार्क्स UTF16-ले के लिए इस्तेमाल किया और UTF-32LE के बीच एक अस्पष्टता है जैसे।यूनिकोड बीओएम बनाम UTF32-ले

FF FE 00 00 00 00 00 00 

मैं कैसे बता सकता इस फाइल शामिल है: विशेष रूप से, जो निम्न 8 बाइट का है एक फाइल पर विचार

  1. UTF16-ले बीओएम (एफएफ FE) 3 अशक्त पात्रों द्वारा पीछा किया; या
  2. यूटीएफ 32-ली बीओएम (एफएफ एफई 00 00) एक नल चरित्र के बाद?

यूनिकोड बीओएम का वर्णन यहां किया गया है: http://unicode.org/faq/utf_bom.html#bom4 लेकिन इस अस्पष्टता पर कोई चर्चा नहीं है। क्या मैं कुछ भूल रहा हूँ?

उत्तर

10

जैसा कि नाम से पता चलता है, बीओएम केवल आपको बाइट ऑर्डर बताता है, एन्कोडिंग नहीं। आपको पता होना चाहिए कि एन्कोडिंग पहले क्या है, फिर आप बीओएम का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि कम से कम या सबसे महत्वपूर्ण बाइट मल्टीबाइट अनुक्रमों के लिए पहले हैं या नहीं।

बीओएम के एक भाग्यशाली पक्ष प्रभाव है कि आप भी कभी कभी यह उपयोग कर सकते हैं एन्कोडिंग लगता है कि अगर आप यह पता नहीं है, लेकिन यह क्या इसके लिए डिजाइन किया गया था नहीं है और यह उचित इनकोडिंग भेजने के लिए कोई विकल्प नहीं है जानकारी।

10

यह स्पष्ट नहीं है। FF FE यूटीएफ -16LE के लिए है, और FF FE 00 00 यूटीएफ -32LE को दर्शाता है। यह सोचने का कोई कारण नहीं है कि FF FE 00 00 संभवतः यूटीएफ -16LE है क्योंकि यूटीएफ को टेक्स्ट के लिए डिज़ाइन किया गया था, और उपयोगकर्ताओं को अपने टेक्स्ट में एनयूएल अक्षरों का उपयोग नहीं करना चाहिए। आखिरकार, आखिरी बार जब आपने एक हेक्स संपादक खोला था और 00 के कुछ बाइट्स को टेक्स्ट दस्तावेज़ में डाला था?^_^

+4

अशक्त चरित्र अच्छी तरह से एक उच्च क्रम पाठ में इनकोडिंग प्रोटोकॉल का हिस्सा हो सकता है। यूनिकोड वास्तव में इस बात की परवाह नहीं करता है कि पाठ में कौन से कोड बिंदुओं का उपयोग किया जाता है और यू +0000 यू +0041 के रूप में मान्य है। – Joey

+2

एक उच्च-आदेश प्रोटोकॉल पढ़ना, यह सिद्धांत प्रश्न सेटिंग के साथ संघर्ष करता है जहां एन्कोडिंग का आकलन किया जाना चाहिए। यदि आप प्रोटोकॉल पढ़ रहे हैं, तो आप एन्कोडिंग का अनुमान नहीं लगाते हैं। – u0b34a0f6ae

+1

इसे एक और तरीके से रखने के लिए, फ़ाइल की शुरुआत में U + 0000 होना असंभव * नहीं है, लेकिन यह * बेहद दुर्लभ * है। यदि यह आपके द्वारा पढ़े जा रहे डेटा की संभावना है तो आपको प्रारूप पहचान के लिए बीओएम पर भरोसा नहीं करना चाहिए। –

1

मैं एडवर्ड की तरह एक ही समस्या का अनुभव किया है। मैं डस्टिन से सहमत हूं, आमतौर पर टेक्स्टफाइल में शून्य-वर्णों का उपयोग नहीं करेगा।

हालांकि मैं यह है कि सभी यूनिकोड वर्ण हैं एक फ़ाइल बनाया है। मैंने पहले यूटीएफ -32 एन्कोडिंग, फिर एक यूटीएफ -32 ए एन्कोडिंग, एक यूटीएफ -16 एल और एक यूटीएफ -16 ए एन्कोडिंग के साथ-साथ एक यूटीएफ -8 एन्कोडिंग का उपयोग किया है।

utf-8 के लिए फ़ाइलों को फिर से सांकेतिक शब्दों में बदलना करने की कोशिश कर रहे हैं, मैं पहले से ही विद्यमान utf-8 फ़ाइल के लिए परिणाम की तुलना करना चाहते थे। चूंकि बीओएम के बाद मेरी फाइलों में पहला अक्षर शून्य-चरित्र है, मैं यूटीएफ -16 बीओएम के साथ फाइल को सफलतापूर्वक पहचान नहीं पाया, यह यूटीएफ -32 एल बीओएम के रूप में दिखाई दिया, क्योंकि बाइट्स बिल्कुल एडवर्ड के वर्णन के समान दिखाई दिए। बीओएम एफएफएफई के बाद पहला चरित्र 0000 है, लेकिन बीओएम डिटेक्शन को बीओएम एफएफएफई 0000 मिला और इसलिए, यूटीएफ -16 के बजाय यूटीएफ -32ले का पता चला, जिससे मेरा पहला 0000-चरित्र चोरी हो गया और बीओएम के हिस्से के रूप में लिया गया।

तो किसी को कभी भी utf-16 छोटे एंडियन के साथ एन्कोड किए गए फ़ाइल के पहले अक्षर के रूप में शून्य-वर्ण का उपयोग नहीं करना चाहिए, क्योंकि यह utf-16le और utf-32le BOM अस्पष्ट बना देगा।

मेरी समस्या का समाधान करने के लिए, मैं पहले और दूसरे चरित्र स्वैप जाएगा। :-)

+0

यदि आप एन्कोडिंग का पता लगाने के लिए अकेले बीओएम पर भरोसा करते हैं, तो आपको यूटीएफ -16/32 अस्पष्टता को हल करने के लिए बस बीओएम की तुलना में अधिक बाइट्स देखना होगा। पहले यूटीएफ -16LE के लिए जांचें, और यदि पता चला है तो जांच करें कि बाद के एन * 2 बाइट वैध यूटीएफ -16LE हैं, जहां एन उचित संख्या है। यदि वैध यूटीएफ -16LE मान्य नहीं है, तो शुरू करें और यूटीएफ -32LE मान लें। यू +0000 एकमात्र संदिग्ध कोडपॉइंट होना चाहिए, और फ़ाइल की शुरुआत में कई नल नहीं होना चाहिए। किसी बिंदु पर, एक कटऑफ होना पड़ता है, और यदि आप तब भी अस्पष्टता को हल नहीं कर सकते हैं, तो उपयोगकर्ता को संकेत दें, या किसी त्रुटि के साथ प्रोसेसिंग को विफल करें। –

+0

जिसका अर्थ है, अगर कोई यूटीएफ -32 एल बीओएम का पता लगाता है, तो सबसे पहले यह जांचना चाहिए कि क्या यह वास्तव में एक यूएफ 0000 बीओएम है जो कोडपॉइंट के बाद यू +0000 है। यदि बहुत सारे शब्द हैं, तो यह संभवतः सरोगेट्स का पता लगाने में मदद कर सकता है। लेकिन अगर केवल एक दृश्य शब्द हैं, तो यह कठिन हो सकता है। लेकिन मैं सहमत हूं, वैध यूटीएफ -32 कोडपॉइंट्स की जांच करते समय, संभवतः आपको 0x10FFFF अधिकतम से अधिक कोडपॉइंट मिलेगा यदि यह वास्तव में एक utf-16 एन्कोडेड फ़ाइल है। वैसे भी हमें यू +0000 की तुलना में किसी अन्य कोडपॉइंट को हमेशा utf-16le एन्कोडेड फ़ाइल के भीतर पहले कोडपॉइंट के रूप में रखने की अनुशंसा करनी चाहिए। – brighty