Um valor de sentinela Unicode que eu posso usar?

15

Eu estou desenhando um formato de arquivo e quero fazer o certo. Como é um formato binário, o primeiro byte (ou bytes) do arquivo deve não formar caracteres textuais válidos (assim como no cabeçalho do arquivo PNG 1 ). Isso permite que as ferramentas que não reconhecem o formato ainda vejam que não é um arquivo de texto observando os primeiros bytes.

Qualquer codepoint acima de 0x7F é US-ASCII inválido, o que é fácil. Mas para Unicode é uma história totalmente diferente. Além dos caracteres Unicode válidos, há caracteres de uso particular , não caracteres e sentinelas , como eu encontrei no Unicode caracteres de uso particular, sem caracteres e & Perguntas frequentes sobre sentinelas .

O que seria uma sequência sentinela de bytes que eu possa usar no início do arquivo que resultaria em US-ASCII, UTF-8, UTF-16LE e UTF-16BE inválidos?

  • Obviamente, o primeiro byte não pode ter um valor abaixo de 0x80 , já que seria um caractere US-ASCII (controle) válido, portanto 0x00 não pode ser usado.
  • Além disso, como caracteres de uso particular são caracteres Unicode válidos, também não posso usar esses pontos de código.
  • Como deve funcionar com o UTF-16 little-endian e o big-endian, um noncharacter como 0xFFFE também não é possível, pois seu reverso 0xFEFF é um caractere Unicode válido.
  • As perguntas frequentes acima mencionadas sugerem não usar nenhum não-caracteres , pois isso ainda resultaria em uma sequência Unicode válida, então algo como 0xFFFF também está fora de questão.

Quais seriam os valores sentinela preparados para o futuro deixados para uso?

1 ) O formato PNG tem como primeiro byte o valor não-ASCII 0x89 , seguido pela string PNG . Uma ferramenta que lê os primeiros bytes de um PNG pode determinar que é um arquivo binário, pois não pode interpretar 0x89 . Um arquivo GIF, por outro lado, inicia diretamente com a sequência ASCII válida e legível GIF , seguida por mais três caracteres ASCII válidos. Para GIF, uma ferramenta pode determinar que é um arquivo de texto legível. Isso está errado e a ideia de iniciar o arquivo com uma sequência de bytes não textural veio de Criando formatos de arquivo por Andy McFadden.

    
por Daniel Pelsmaeker 13.03.2013 / 16:15
fonte

3 respostas

16

0xDC 0xDC

  • Obviamente inválido UTF-8 e ASCII
  • Trilha não pareada substituta na posição de chumbo, independente de endianess em UTF-16. Não fica mais inválido UTF-16 do que isso.
por 13.03.2013 / 17:03
fonte
5
  • No UTF-8, os bytes C0, C1 e F5 - FF são ilegais. O primeiro byte deve ser ASCII ou um byte no intervalo C2-F4, qualquer outro byte inicial não é válido UTF-8.

  • Em UTF-16, o arquivo normalmente começa com a marca de ordem de byte (U + FEFF), caso contrário, os aplicativos precisam adivinhar a ordem de bytes. Pontos de código no intervalo D800-DBFF são bytes de lead para um par substituto e DC00-DFFF são os bytes finais para um par substituto.

Assim, eu usaria a combinação de bytes F5DC . Estes dois valores são:

  • Não ASCII
  • Não é válido UTF-8
  • Interpretado como byte de rastreamento UTF-16 em um par substituto (não legal) ou o codepoint U + F5DC, que é um caractere de uso privado, mas somente por aplicativos que tentam teimosamente interprete isso como UTF-16, mesmo sem uma lista de materiais.

Se você precisar de mais opções, F5DD a F5DF terão as mesmas 3 propriedades, assim como F6DC - F6DF , F7DC - F7DF e F8DC - F8DF , para um total de 16 combos de bytes diferentes para escolher.

    
por 13.03.2013 / 17:27
fonte
1

Se você está tentando usar um caractere não imprimível para indicar "não texto", você achará difícil de bater 0x89:

  • Está fora do intervalo EUA-ASCII
  • Na ISO-8859-1 é um caractere não imprimível ("TABELA DE CARACTERES COM JUSTIFICAÇÃO"). Da mesma forma com o Shift-JIS, que acredito ainda estar em uso comum. Outras codificações de 8 bits podem, no entanto, tratar isso como um caractere válido.
  • Em UTF-8, é um primeiro byte inválido para uma sequência de múltiplos bytes (os bits superiores são 10, reservados para os caracteres 2.N de uma sequência de múltiplos bytes)

Geralmente, quando você forma números mágicos, "não-texto" é um ponto secundário. Vou ter que procurar a referência, mas um dos formatos gráficos padrão (TIFF, eu acho) tem algo como seis diferentes informações úteis do seu número mágico.

    
por 14.03.2013 / 00:11
fonte

Tags