Pergunta

São estes obsoleto? Eles parecem ser a pior idéia que nunca - algo incorporar no conteúdo de seu arquivo que ninguém pode ver, mas os impactos funcionalidade do arquivo. Eu não entendo por que eu iria querer um.

Foi útil?

Solução

Eles são necessários em alguns casos, sim, porque há dois pequenos-endian e big-endian implementações de UTF-16.

Ao ler um arquivo UTF-16 desconhecido, como você pode dizer qual dos dois é usado? A única solução é colocar algum tipo de marcador facilmente identificável no arquivo, que nunca pode ser confundida com qualquer outra coisa, independentemente do endian-ness usado.

Isso é o que o BOM faz.

E você precisa de um? Só se você estiver 1) usando uma codificação UTF onde endianness é um problema (Não importa para UTF-16, mas UTF8 olha sempre o mesmo, independentemente de endianness), e o arquivo vai ser compartilhada com aplicações externas.

Se o seu próprio aplicativo é o único que vai ler e escrever o arquivo, você pode omitir o BOM, e simplesmente decidir de uma vez por todas que endianness você está indo para uso. Mas se outra aplicação tem de ler o arquivo, ele não saberá a endianness com antecedência, para adicionar o BOM pode ser uma boa idéia.

Outras dicas

Alguns trechos da e BOM FAQ do Consórcio Unicode pode ser útil.

Q:? O que é um BOM

A: A marca de ordem de byte (BOM) é constituído pelo código de caracteres U + FEFF , no início de um fluxo de dados , onde ele pode ser usado como uma assinatura definindo a ordem de byte e que codifica forma, principalmente dos ficheiros de texto simples não marcados. Sob alguns protocolos de nível mais elevado, a utilização de uma lista de materiais pode ser obrigatória (ou proibido) no fluxo de dados Unicode definido em que protocolo. (grifo meu).

Eu não exatamente dizer a marca de ordem de byte é incorporada nos dados. Em vez disso, prefixos os dados. O personagem é apenas uma marca de ordem de byte quando é a primeira coisa no fluxo de dados. Em qualquer outro lugar, e é a de largura zero espaço não-quebra . Unicode-aware programas que não honram a marca de ordem de bytes não são realmente prejudicados por sua presença de qualquer maneira desde que o personagem é invisível, e uma palavra-marceneiro no início de um bloco de texto apenas se junta o próximo caractere a nada, por isso não tem efeito.

Q: Onde é um BOM útil

A: A BOM é útil no início de arquivos que são digitados como texto, mas para os quais não se sabe se eles estão em grande ou pequena endian formato de ele também pode servir como um dica indicando que o arquivo está em Unicode, em oposição a em uma codificação de legado e, além disso, é agir como uma assinatura para a forma de codificação específica utilizada.

Então, você quer um BOM quando o programa é capaz de lidar com várias codificações de Unicode. De que outra forma o seu programa de saber qual a codificação para usar ao interpretar a sua entrada?

Q:? Quando uma BOM é utilizado, é apenas em texto Unicode de 16 bits

A: Não, um BOM pode ser usado como uma assinatura, não importa como o texto Unicode é transformada: UTF-16, UTF-8, UTF-7, etc. Os bytes exatas que compreende o BOM será o que o caractere Unicode U + FEFF é convertida em por esse formato de transformação. Nesse formulário, o BOM serve para indicar tanto que é um arquivo Unicode, e quais os formatos que se encontra.

Isso é provavelmente o caso em que o BOM é usado com mais frequência hoje. Distingue texto codificado em UTF-8 de quaisquer outras codificações; não é realmente marcar a ordem dos bytes desde UTF-8 só tem um fim.

Se você está projetando seu próprio formato de protocolo ou de dados, você não está obrigado a usar um BOM. Outra questão a partir das FAQ toques em que:

Q:? Como dados de tag I que não interpretam U + FEFF como um BOM

A: Use a tag UTF-16BE para indicar big-endian UTF-16 de texto, e UTF-16LE para indicar little-endian UTF-16 texto. Se você usar um BOM, tag o texto simplesmente como UTF-16.

Ele menciona o conceito de marcação formato de seus dados. Isso significa que especificam o formato out-of-band a partir dos dados em si. Isso é ótimo se uma instalação desse tipo está disponível para você, mas muitas vezes não é, especialmente quando os sistemas mais antigos estão sendo adaptados para Unicode.

Os significa BOM que codificam de Unicode o arquivo está em. Sem essa distinção, um leitor de unicode não saberia como ler o arquivo.

No entanto, UTF-8 não requer um BOM.

Confira o Wikipedia artigo .

Como você marcou isto com UTF-8 Eu vou dizer que você não precisa de uma BOM. Byto Order marcas só são úteis para UTF-16 e UTF-32, uma vez que informa o computador se o arquivo está em Big Endian ou Little Endian . Alguns editores de texto podem usar o Byte Order Mark decidir o que codificar os usos de documentos, mas isso não é parte do padrão Unicode.

O "BOM" é um resquício dos primeiros dias de Unicode quando assumiu-se que o uso de Unicode significaria o uso de caracteres de 16 bits. É completamente inútil em uma codificação como UTF-8, que tem apenas uma ordem de byte. A escolha de U + FEFF também é sub-ótima para UTF-32, porque ele não pode distinguir entre todas as possíveis ordens de byte de meia-endian (para fazer isso exigiria uma BOM codificados com 4 diferente bytes).

A única razão que você usaria um é ao enviar UTF-16 ou os dados UTF-32 entre as plataformas com diferentes ordens de bytes, mas (1) a maioria das pessoas usa UTF-8 de qualquer maneira, e (2) o parâmetro charset MIME fornece um mecanismo melhor.

UTF16 e UTF32 podem ser escritos em Big-Endian e formas little-endian. Você poderia tentar determinar heuristicamente o endianess analisando o resultado de tratar o arquivo em qualquer endianess, mas para salvá-lo tudo o que se preocupar, o BOM pode dizer-lhe imediatamente.

UTF-8 não realmente precisa de um BOM embora, como você decodificá-lo byte por byte.

Independentemente de você usar esses mesmo ao criar arquivos de texto, seu provavelmente vale a pena estar ciente de quando você lê arquivos de texto. isto é, detectar e ignorar (e idealmente lidar adequadamente) a lista de materiais no inicio do ficheiro. Já corri em alguns que tinham e que causou meus algumas questões inicialmente até que eu descobri o que estava acontecendo.

Como UTF16 e BOMs UTF32 dizer se o conteúdo está em Big-Endian ou formato little-endian e também que o conteúdo é Unicode, os UTF-8 classifica BOM do arquivo como utf-8 codificado. Sem a UTF-8 BOM, como você pode saber se é um arquivo ANSI ou arquivo codificado UTF-8? O BOM UTF-8 não diz endianess é claro, porque utf-8 é sempre um fluxo de bytes, mas diz se o conteúdo é utf-8 codificado Unicode ou ANSI. Claro que você pode fazer a varredura para UTF-8-seqüências válidas, mas na minha opinião, é mais fácil para verificar os três primeiros bytes do arquivo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top