Estoy diseñando un formato de archivo y quiero hacerlo bien. Como es un formato binario, el primer byte (o bytes) del archivo debería no formar caracteres textuales válidos (como en el encabezado del archivo PNG 1 ). Esto permite que las herramientas que no reconocen el formato sigan viendo que no es un archivo de texto mirando los primeros bytes.
Cualquier punto de código por encima de 0x7F
no es válido US-ASCII, por lo que es fácil. Pero para Unicode es una historia completamente diferente. Además de los caracteres válidos de Unicode, hay caracteres de uso privado , no caracteres y centinelas , como he encontrado en Caracteres de uso privado de Unicode, caracteres no & Preguntas frecuentes de Sentinels .
¿Cuál sería una secuencia de bytes centinela que puedo usar al inicio del archivo que daría como resultado US-ASCII, UTF-8, UTF-16LE y UTF-16BE no válidos?
- Obviamente, el primer byte no puede tener un valor inferior a
0x80
, ya que sería un carácter válido de US-ASCII (control), por lo que no se puede usar0x00
. - Además, dado que los caracteres de uso privado son caracteres Unicode válidos, tampoco puedo usar esos puntos de código.
- Dado que debe funcionar tanto con little-endian como con big-endian UTF-16, un no carácter como
0xFFFE
tampoco es posible ya que su reverso0xFEFF
es un carácter Unicode válido. - Las preguntas frecuentes mencionadas anteriormente sugieren que no se use ninguno de los no caracteres , ya que eso daría como resultado una secuencia de Unicode válida, por lo que algo como
0xFFFF
también está fuera de la imagen.
¿Cuáles serían los valores de centinela preparados para el futuro que me quedan por usar?
1 ) El formato PNG tiene como primer byte el valor no-ASCII 0x89
, seguido de la cadena PNG
. Una herramienta que lee los primeros bytes de un PNG puede determinar que es un archivo binario, ya que no puede interpretar 0x89
. Un archivo GIF, por otro lado, comienza directamente con la cadena ASCII válida y legible GIF
seguida de otros tres caracteres ASCII válidos. Para GIF, una herramienta puede determinar que es un archivo de texto legible. Esto es incorrecto y la idea de iniciar el archivo con una secuencia de bytes sin textura provino de Diseño de formatos de archivo por Andy McFadden.