Saxparser Ignore Byte Order Mark
-
27-09-2019 - |
Pergunta
Nosso saxparser não ignora a marca de ordem de bytes 
que aparece no início do arquivo.
Como faço para que meu analisador de sax ignore a marca de pedidos de bytes?
Solução
Parece que você pode estar dando entrada UTF-16 a um saxparser que não espera UTF-16. Tente converter os dados em UTF-8, isso pode ajudar.
Outras dicas
Verifique o arquivo em um editor hexadecimente.
Se os bytes iniciais são de fato \xEF\xBB\xBF
Seguido pelo próprio documento, então é um FAUX-BOM UTF-8. Embora os faux-Boms UTF-8 sejam uma falta de falta e ferramentas que os geram precisam ser destruídas com ácido especial de programação, a especificação XML faz exigir Analisadores para reconhecer e ignorar essa sequência de bytes; portanto, se o seu analisador de sax não é compatível e precisa de algum chute.
Se os bytes iniciais que estão lhe dando 
são realmente algo como um de:
\xC3\xAF\xC2\xBB\xC2\xBF
\xEF\xBB\xBF\xC3\xAF\xC2\xBB\xC2\xBF
\xEF\x00\xBB\x00\xBF\x00
\xFF\xFE\xEF\x00\xBB\x00\xBF\x00
Então o que você tem é um codificação dupla acidental. Nesse caso, você precisa olhar para o programa que produz o arquivo, porque não é bem formado, um analisador sax estaria correto para reclamar e outros caracteres Unicode no arquivo provavelmente também seriam confusos. Possivelmente está fazendo algo bobo como seriar o documento a uma string de bytes e depois enviá -la através de um ciclo de decodificação/codificação falso.
De qualquer forma, se você precisar fazer o analisador pular a sequência problemática de bytes, precisaria alimentá -la com uma versão que hackeou manualmente para remover este prefixo. Sem saber o que seu analisador sax é (ou mesmo qual idioma) é difícil dizer como fazer isso.
Talvez você possa procurar o fluxo de entrada antes de passá -lo para o analisador? Talvez você possa ler o arquivo em uma string de byte e passar isso, tosada dos bytes iniciais, para o analisador? Se o seu analisador não fornecer essas opções, você precisará carregar o arquivo como bytes, prenda o início e salve -o novamente em um novo arquivo.