O problema dos primeiros caracteres da BOM encontrados ao ler arquivos Unicode (UTF-8, etc.) em Java e como lidar com eles
Arquivos de texto criados com um editor de texto no Windows terão um ID de BOM adicionado ao cabeçalho do arquivo (o primeiro caractere) se você optar por salvá-los em um formato Unicode, como UTF-8.
Essa identificação não é removida quando o arquivo é lido em Java, e String.trim() não pode ser removido. Se você usar readLine() para ler a primeira linha e armazená-la na String, o comprimento da String será 1 maior do que o que você vê, e o primeiro caractere é esta lista de comandos.
Isso pode causar alguns problemas, como ao ler um arquivo ini, se você quiser saber se a primeira linha começa com "[", não consegue julgar corretamente.
Felizmente, quando o Java lê arquivos Unicode, ele muda uniformemente a lista de materiais para "\uFEFF", então você pode resolver manualmente (após o julgamento, use substring() ou replace() para remover essa lista de materiais (BOM):
No entanto,Essa abordagem não é perfeitaSe o arquivo jar gerado roda no Windows, ainda há um problema. A solução definitiva é usar o BOMInputStream fornecido pelo apache commons io:
O que é BOM?
BOM = Marca de Ordem de Bytes A lista de materiais é o método recomendado para marcar a ordem dos bytes na especificação Unicode. Por exemplo, para UTF-16, se o receptor recebe uma lista de materiais de FEFF, isso indica que o fluxo de bytes é Big-Endian; Se FFFE for recebido, indica que o fluxo de bytes é Little-Endian. O UTF-8 não requer uma lista de materiais para indicar a ordem dos bytes, mas pode ser usado para indicar "Estou codificado em UTF-8". A codificação UTF-8 da lista de materiais é EF BB BF (como visto ao abrir texto com UltraEdit e mudar para hexadecimal). Então, se o receptor recebe um fluxo de bytes que começa com EF BB BF, ele sabe que é codificação UTF-8.
|