2009-11-20 5 views
21

एएनएसआई एक्सएमएल दस्तावेज़ में बीओएम वास्तव में क्या है और इसे हटाया जाना चाहिए? क्या एक्सएमएल दस्तावेज़ यूटीएफ -8 में होना चाहिए? क्या कोई मुझे जावा विधि बता सकता है जो बीओएम का पता लगाएगा? बीओएम में ईएफ बीबी बीएफ के पात्र शामिल हैं।एक्सएमएल बीओएम क्या है और मैं इसे कैसे पहचानूं?

उत्तर

19

एएनएसआई एक्सएमएल फ़ाइल के लिए इसे वास्तव में हटा दिया जाना चाहिए। यदि आप यूटीएफ -8 का उपयोग करना चाहते हैं तो आपको वास्तव में इसकी आवश्यकता नहीं है। केवल यूटीएफ -16 और यूटीएफ -32 के लिए इसकी आवश्यकता है।

बाइट आदेश-मार्क (या बीओएम), एक विशेष मार्कर एक यूनिकोड फ़ाइल के बहुत शुरुआत में जोड़ा UTF-8 में इनकोडिंग है, UTF-16 या UTF-32। यह का उपयोग यह इंगित करने के लिए किया जाता है कि फ़ाइल बड़े-एंडियन या छोटे-एंडियन बाइट ऑर्डर का उपयोग करती है या नहीं। बीओएम यूटीएफ -16 और यूटीएफ -32 के लिए अनिवार्य है, लेकिन यह यूटीएफ -8 के लिए वैकल्पिक है।

इस सवाल के बारे में कि जावा में इसका पता कैसे लगाया जाए।

इस प्रश्न का निम्न उत्तर देखें: जावा: How to determine the correct charset encoding of a stream और यदि अब आप स्वयं को बीओएम निर्धारित करना चाहते हैं (अपने जोखिम पर) उदाहरण के लिए इस कोड Java Tip: How to read a file and automatically specify the correct encoding देखें।

मूल रूप से केवल पहले कुछ बाइट्स में पढ़ा जाए और फिर यह निर्धारित करें कि क्या आप को बीओएम मिला है।

+0

महान उत्तर के लिए धन्यवाद। चूंकि मैं फ़ाइल को यूटीएफ -8 होने की उम्मीद कर रहा हूं, इसलिए मैं पहले 3 वर्णों को अनदेखा कर रहा हूं जैसे कि: स्ट्रिंग file1sub = getXMLContents (file1) .substring (3); – djangofan

+1

@jitter - मुझे यकीन नहीं है कि बीओएम पर आपका उद्धरण कहां से आता है। एक्सएमएल को यूटीएफ -16 या यूटीएफ -32 दस्तावेज़ों में बीओएम की आवश्यकता नहीं है - एक पार्सर को बिना प्रबंधन करना चाहिए। एक्सएमएल एन्कोडिंग पहचान: http://www.w3.org/TR/REC-xml/#sec-guessing अन्यथा, बीओएम की आवश्यकता डोमेन-निर्भर है। Unicode.org बीओएम अकसर किये गए सवाल: http://unicode.org/faq/utf_bom.html#BOM – McDowell

+0

जो बताता है कि क्यों नोटपैड ++ आपको नई फ़ाइलों के लिए "यूटीएफ -8 बीओएम के बिना डिफ़ॉल्ट" सेट करने की अनुमति देता है – djangofan

15

बाइट क्रम चिह्न इन बाइट दृश्यों में से एक होने की संभावना है:

 UTF-8 BOM: ef bb bf 
    UTF-16BE BOM: fe ff 
    UTF-16LE BOM: ff fe 
    UTF-32BE BOM: 00 00 fe ff 
    UTF-32LE BOM: ff fe 00 00 

ये यूनिकोड कोडपॉइंट U + FEFF के नाना प्रकार से इनकोडिंग रूप हैं। इसे '\uFEFF' का उपयोग कर जावा चार शाब्दिक के रूप में व्यक्त किया जा सकता है (जावा चार मान निहित यूटीएफ -16) हैं। चूंकि यू + एफईएफएफ अधिकांश एन्कोडिंग में नहीं है, इसलिए इस बीओएम कोडपॉइंट को उनके द्वारा एन्कोड किया जाना संभव नहीं है। (More on encoding the BOM using Java here।)

जब बीओएम और एक्सएमएल की बात आती है, तो वे वैकल्पिक होते हैं (Unicode BOM FAQ भी देखें)। एक्सएमएल में एन्कोडिंग का पता लगाना अपेक्षाकृत सीधा है अगर घोषणा में एन्कोडिंग निर्दिष्ट है। हमेशा सुनिश्चित करें कि XML घोषणा (<?xml version="1.0" encoding="UTF-8"?>) दस्तावेज़ लिखने के लिए उपयोग किए गए एन्कोडिंग से मेल खाता है। यदि आप इसके बारे में सख्त हैं, तो पार्सर्स आपके दस्तावेज़ों को सही ढंग से समझने में सक्षम होना चाहिए। (XML spec on encoding detection.)

मैं जहां भी संभव हो यूनिकोड के रूप में एन्कोडिंग की सलाह देता हूं (10 Commandments of Unicode भी देखें)। उस ने कहा, एक्सएमएल एस्केप इकाइयों के माध्यम से किसी भी यूनिकोड चरित्र के प्रतिनिधित्व की अनुमति देता है (उदा। 'ए' को &#x0041; द्वारा दर्शाया जा सकता है), इसलिए डेटा हानि से बचने की आवश्यकता नहीं है।

+0

* »एक्सएमएल अनुमति देता है एस्केप इकाइयों के माध्यम से किसी भी यूनिकोड चरित्र का प्रतिनिधित्व «* - ठीक है, सिवाय इसके कि आपको सीडीएटीए अनुभागों की आवश्यकता है ;-) – Joey

4

एक यूटीएफ -8 फ़ाइल में बीओएम डालें मत: यदि दो ऐसी फाइलें विलय हो जाती हैं, तो आप मध्य में एक बीओएम के साथ समाप्त हो जाते हैं जो एक आवेदक तोड़ सकता है, या एक एक्सएमएल पार्सर को अपवाद फेंकने का कारण बनता है।

+0

आह। दिलचस्प टिप। मैने इसके बारे में कभी नहीं सोचा था। सौभाग्य से, एक्सएमएल फाइलों को विलय करना आम नहीं है। – djangofan

+0

और यूटीएफ -16LE फ़ाइल में बीओएम के बारे में क्या? –

3

ओपी:

किसी को भी मुझे एक जावा विधि है कि बीओएम की पहचान करेगा बता सकते हैं?

org.apache.commons.io.input.BOMInputStream Javadocs:

इस वर्ग के इन बाइट्स पता लगाता है और, यदि आवश्यक हो, उन्हें स्वचालित रूप से छोड़ सकते हैं और धारा में पहली बाइट के रूप में बाद में बाइट लौट सकते हैं।

+0

मुझे यकीन नहीं है कि यह सवाल जवाब देने में सहायक कैसे हो सकता है "एक्सएमएल बीओएम क्या है और मैं इसे कैसे पहचानूं?" – Matt

+0

@ मैट - मैंने जवाडॉक्स से विवरण की प्रतिलिपि बनाई। उम्मीद है की वो मदद करदे। –

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