O que é XML BOM e como posso detectá-lo?

O que exatamente é a lista de materiais em um documento XML ANSI e deve ser removido? Um documento XML deve estar em UTF-8? Alguém pode me dizer um método Java que detectará a lista de materiais? O BOM consiste nos caracteres EF BB BF.

Para um arquivo XML ANSI, ele deve ser removido. Se você quiser usar o UTF-8, você realmente não precisa dele. Apenas para UTF-16 e UTF-32 é necessário.

O Byte-Order-Mark (ou BOM), é um marcador especial adicionado no início de um arquivo Unicode codificado em UTF-8, UTF-16 ou UTF-32. Ele é usado para indicar se o arquivo usa a ordem de byte big endian ou little-endian. A lista técnica é obrigatória para UTF-16 e UTF-32, mas é opcional para UTF-8.

Quanto à questão sobre como detectar isso em java.

Verifique a seguinte resposta a esta pergunta: Java: Como determinar a codificação correta de charset de um stream e se você deseja determinar o BOM por conta própria (por sua conta e risco) verifique por exemplo este código Java Dica: Como ler um arquivo e especificar automaticamente a codificação correta .

Basicamente apenas leia os primeiros bytes e depois determine se você encontrou uma lista de materiais.

A marca de ordem de byte é provavelmente uma dessas sequências de bytes:

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 

Essas são as formas codificadas do Unicode U + FEFF. Isso pode ser expresso como um literal de caracteres Java usando '\uFEFF' (os valores char do Java são implicitamente UTF-16). Como o U + FEFF não está na maioria das codificações, não é possível codificar esse ponto de código da BOM. ( Mais sobre a codificação da BOM usando Java aqui .)

Quando se trata de BOMs e XML, eles são opcionais (consulte também a FAQ da BOM do Unicode ). A detecção de codificação em XML é relativamente direta se a codificação for especificada na declaração. Sempre verifique se a declaração XML ( ) Corresponde à codificação usada para gravar o documento. Se você é rigoroso sobre isso, os analisadores devem ser capazes de interpretar seus documentos corretamente. ( Especificação XML na detecção de codificação. )

Eu defendo a codificação como Unicode sempre que possível (veja também os 10 Mandamentos do Unicode ). Dito isso, o XML permite a representação de qualquer caractere Unicode por meio de entidades de escape (por exemplo, ‘A’ pode ser representado por A ), portanto, não é necessariamente um requisito evitar a perda de dados.

Não insira uma BOM em um arquivo utf-8: se dois desses arquivos forem mesclados, você acabará com uma BOM no meio que pode quebrar uma aplicação ou fazer com que um analisador xml ative uma exceção.

OP:

Alguém pode me dizer um método Java que detectará a lista de materiais?

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

Essa class detecta esses bytes e, se necessário, pode ignorá-los automaticamente e retornar o byte subsequente como o primeiro byte no stream.