2009-11-20 10 views
21

Che cosa è esattamente il BOM in un documento ANSI XML e dovrebbe essere rimosso? Dovrebbe invece un documento XML essere in UTF-8? Qualcuno può dirmi un metodo Java che rileverà il BOM? Il BOM è composto dai caratteri EF BB BF.Che cos'è XML BOM e come lo si rileva?

risposta

19

Per un file XML ANSI dovrebbe essere effettivamente rimosso. Se vuoi usare UTF-8 non ne hai davvero bisogno. È necessario solo per UTF-16 e UTF-32.

Il Byte-Order-Mark (o BOM), è un marcatore speciale aggiunto alla all'inizio di un file Unicode molto codificato in UTF-8, UTF-16 o UTF-32. Viene utilizzato per indicare se il file utilizza l'ordine big-endian o little-endian . Il BOM è obbligatorio per UTF-16 e UTF-32, ma è facoltativo per UTF-8.

Riguardo alla domanda su come rilevare questo in Java.

Controllare la seguente risposta a questa domanda: Java: How to determine the correct charset encoding of a stream e se si desidera determinare autonomamente il BOM (a proprio rischio), controllare ad esempio questo codice Java Tip: How to read a file and automatically specify the correct encoding.

In pratica basta leggere i primi pochi byte e quindi determinare se è possibile che abbia trovato una BOM.

+0

grazie per l'ottima risposta. dal momento che mi aspetto che il file sia UTF-8, sto semplicemente ignorando i primi 3 caratteri usando qualcosa come: String file1sub = getXMLContents (file1) .substring (3); – djangofan

+1

@jitter - Non sono sicuro da dove provenga la tua offerta di BOM. XML non richiede una distinta base in documenti UTF-16 o UTF-32 - un parser dovrebbe gestirlo senza. Rilevamento della codifica XML: http://www.w3.org/TR/REC-xml/#sec-guessing Altrimenti, il requisito per una distinta base è dipendente dal dominio. FAQ BOM di Unicode.org: http://unicode.org/faq/utf_bom.html#BOM – McDowell

+0

che spiega perché Notepad ++ consente di impostare l'impostazione predefinita per i nuovi file "UTF-8 senza BOM" – djangofan

15

Il BOM è probabile che sia una di queste sequenze di byte:

 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 

Queste sono le forme variamente codificate del Unicode codepoint U + FEFF. Questo può essere espresso come un valore letterale del char Java utilizzando '\uFEFF' (i valori di char Java sono implicitamente UTF-16). Poiché U + FEFF non è nella maggior parte delle codifiche, non è possibile codificare in questo codice della distinta base. (More on encoding the BOM using Java here.)

Quando si tratta di BOM e XML, sono opzionali (vedere anche lo Unicode BOM FAQ). Il rilevamento della codifica in XML è relativamente semplice se la codifica è specificata nella dichiarazione. Assicurarsi sempre che la dichiarazione XML (<?xml version="1.0" encoding="UTF-8"?>) corrisponda alla codifica utilizzata per scrivere il documento. Se sei severo su questo, i parser dovrebbero essere in grado di interpretare correttamente i tuoi documenti. (XML spec on encoding detection.)

Io sostengo la codifica come Unicode laddove possibile (vedere anche 10 Commandments of Unicode). Detto questo, XML consente la rappresentazione di qualsiasi carattere Unicode tramite entità di escape (ad esempio 'A' potrebbe essere rappresentato da &#x0041;), quindi non è necessariamente un requisito per evitare la perdita di dati.

+0

* »XML consente di rappresentazione di qualsiasi carattere Unicode tramite entità di escape «* - beh, eccetto che hai bisogno di sezioni CDATA ;-) – Joey

4

Non inserire una BOM in un file utf-8: se due file di questo tipo vengono uniti, si finisce con una BOM nel mezzo che potrebbe rompere un'application o causare un parser xml per generare un'eccezione.

+0

Ahh. Suggerimento interessante. Non ci ho mai pensato. Fortunatamente, unire i file XML non è così comune. – djangofan

+0

E che dire delle distinte base in un file UTF-16LE? –

3

OP:

qualcuno può dirmi un metodo Java che rileverà la distinta base?

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

Questa classe rileva questi byte e, se necessario, possa saltare e restituire il successivo byte come il primo byte nel flusso automaticamente.

+0

Non sono sicuro di come ciò possa essere utile per rispondere alla domanda "Che cos'è XML BOM e come lo si rileva?" – Matt

+0

@Matt - Ho copiato la descrizione dal Javadocs. Spero possa aiutare. –

Problemi correlati