2011-03-18 20 views
5

मेरे पास utf8 एन्कोडिंग के साथ एक एक्सएमएल है। और इस फ़ाइल में बीओएम फ़ाइल की शुरुआत है। तो पार्सिंग के दौरान मुझे org.xml.sax.SAXParseException के साथ सामना करना पड़ रहा है: प्रोलॉग में सामग्री की अनुमति नहीं है। मैं फ़ाइलों से उन 3 बाइट्स को हटा नहीं सकता। मैं फ़ाइल को स्मृति में लोड नहीं कर सकता और उन्हें यहां हटा सकता हूं (फ़ाइलें बड़ी हैं)। तो प्रदर्शन कारणों से मैं SAX पार्सर का उपयोग कर रहा हूं और अगर वे टैग से पहले मौजूद हैं तो बस उन 3 बाइट्स को छोड़ना चाहते हैं। क्या मुझे इसके लिए इनपुटस्ट्रीम रीडर का उत्तराधिकारी होना चाहिए?क्यों org.apache.xerces.parsers.SAXParser utf8 एन्कोडेड xml में BOM को नहीं छोड़ता है?

मैं जावा में नया हूं - कृपया मुझे सही तरीका दिखाएं।

+0

[बाइट क्रम चिह्न शिकंजा के संभावित डुप्लिकेट अप फ़ाइल पढ़ने जावा में] (http://stackoverflow.com/questions/1835430/byte-order-mark-screws-up-file-reading-in-java) –

उत्तर

4

यह पहले आया है, और जब यह मेरे साथ हुआ तो मुझे स्टैक ओवरफ़्लो पर the answer मिला। संबंधित उत्तर बीओएम के परीक्षण के लिए PushbackInputStream का उपयोग करता है।

1

मैं एक ही समस्या का सामना किया है और मैं इस कोड के साथ इसका समाधान कर लिया:

private static InputStream checkForUtf8BOM(InputStream inputStream) throws IOException { 
    PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3); 
    byte[] bom = new byte[3]; 
    if (pushbackInputStream.read(bom) != -1) { 
     if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) { 
      pushbackInputStream.unread(bom); 
     } 
    } 
    return pushbackInputStream; 
} 
+0

यह यूटीएफ 8 के लिए है ... मुझे लगता है कि यूटीएफ 16 अलग होगा (मुझे विश्वास है इसकी केवल 2 बाइट्स)? – Trinition

+0

देर से क्षमा करें। हां, यूटीएफ 16 में बीओएम केवल दो बाइट्स है: 0xFE 0xFF (बड़ा-एंडियन) या 0xFF 0xFE (थोड़ा-अंत)। – javanna

2
private static char[] UTF32BE = { 0x0000, 0xFEFF }; 
private static char[] UTF32LE = { 0xFFFE, 0x0000 }; 
private static char[] UTF16BE = { 0xFEFF }; 
private static char[] UTF16LE = { 0xFFFE }; 
private static char[] UTF8 = { 0xEFBB, 0xBF }; 

private static boolean removeBOM(Reader reader, char[] bom) throws Exception { 
    int bomLength = bom.length; 
    reader.mark(bomLength); 
    char[] possibleBOM = new char[bomLength]; 
    reader.read(possibleBOM); 
    for (int x = 0; x < bomLength; x++) { 
     if ((int) bom[x] != (int) possibleBOM[x]) { 
      reader.reset(); 
      return false; 
     } 
    } 
    return true; 
} 

private static void removeBOM(Reader reader) throws Exception { 
    if (removeBOM(reader, UTF32BE)) { 
     return; 
    } 
    if (removeBOM(reader, UTF32LE)) { 
     return; 
    } 
    if (removeBOM(reader, UTF16BE)) { 
     return; 
    } 
    if (removeBOM(reader, UTF16LE)) { 
     return; 
    } 
    if (removeBOM(reader, UTF8)) { 
     return; 
    } 
} 

उपयोग:

// xml can be read from a file, url or string through a stream 
URL url = new URL("some xml url"); 
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream())); 
removeBOM(bufferedReader);