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
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.
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 A
), quindi non è necessariamente un requisito per evitare la perdita di dati.
* »XML consente di rappresentazione di qualsiasi carattere Unicode tramite entità di escape «* - beh, eccetto che hai bisogno di sezioni CDATA ;-) – Joey
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.
Ahh. Suggerimento interessante. Non ci ho mai pensato. Fortunatamente, unire i file XML non è così comune. – djangofan
E che dire delle distinte base in un file UTF-16LE? –
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.
Non sono sicuro di come ciò possa essere utile per rispondere alla domanda "Che cos'è XML BOM e come lo si rileva?" – Matt
@Matt - Ho copiato la descrizione dal Javadocs. Spero possa aiutare. –
- 1. Come rimuovere BOM da un file XML in Java
- 2. XDocument: salvataggio XML in un file senza BOM
- 3. Rileva lo scorrimento iniziale e termina lo scorrimento in recyclerview
- 4. Come si rileva che è stato impostato un TEvent?
- 5. XML Groovy e lo spazio dei nomi "xml:"
- 6. Rileva i gesti dell'utente come lo scorrimento
- 7. pause XmlReader in UTF-8 BOM
- 8. Come posso rimuovere la BOM da XmlTextWriter usando C#?
- 9. Python - Come si rileva che un modulo è stato caricato dal caricatore personalizzato?
- 10. Come creare e utilizzare lo spazio dei nomi XML?
- 11. Rileva lo schema delle vene nelle foglie?
- 12. Come si rileva l'ambiente in un'app express.js?
- 13. Come si rileva il ridimensionamento di iframe?
- 14. Che cos'è lo spazio dei nomi XML Android dell'app?
- 15. Come si rileva quando l'output viene reindirizzato?
- 16. query XML mentre si ignora lo spazio dei nomi?
- 17. MonoTouch - Rileva lo scorrimento di UITableView
- 18. Come devo cambiare questa stringa XML in modo che XDocument.Parse lo legga?
- 19. Come faccio a far sì che Razor legga i file UTF-8 senza BOM?
- 20. Rileva l'app iOS inserendo lo sfondo
- 21. Android: rileva lo stato di Non disturbare?
- 22. XML :: LibXML: rileva se due elementi sono uguali?
- 23. conversione utf-16 -> utf-8 E rimuovere BOM
- 24. Cosa fare quando si rileva e (rror) in Java
- 25. PowerShell che salva XML e che conserva il formato
- 26. Quando si chiama Edge.js da C#, come si agganciano lo stdout e lo stderr?
- 27. Rileva adblock e javascript
- 28. Rileva quando l'utente si allontana dalla pagina
- 29. Qual è il DOM e BOM in JavaScript?
- 30. Servizio Windows scritto in python, che non rileva eventi di arresto e si arresta con garbo
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
@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
che spiega perché Notepad ++ consente di impostare l'impostazione predefinita per i nuovi file "UTF-8 senza BOM" – djangofan