Sto progettando un formato di file e voglio farlo nel modo giusto. Poiché è un formato binario, il primo byte (o byte) del file dovrebbe non formare caratteri testuali validi (proprio come nell'intestazione del file PNG 1 ). Ciò consente agli strumenti che non riconoscono il formato di vedere ancora che non è un file di testo guardando i primi pochi byte.
Qualsiasi punto di codice sopra 0x7F
non è valido US-ASCII, quindi è facile. Ma per Unicode è tutta un'altra storia. Oltre ai caratteri Unicode validi ci sono caratteri di uso privato , caratteri non e sentinelle , come ho trovato nel Unicode Uso privato Caratteri, caratteri non numerici e amp; Domande frequenti sulle sentinelle .
Quale sarebbe una sequenza sentinella di byte che posso usare all'inizio del file che risulterebbe in US-ASCII, UTF-8, UTF-16LE e UTF-16BE non validi?
- Ovviamente il primo byte non può avere un valore inferiore a
0x80
in quanto sarebbe un carattere US-ASCII valido (di controllo), quindi% non può essere utilizzato% co_de. - Inoltre, dal momento che i caratteri di uso privato sono caratteri Unicode validi, non posso nemmeno usare quei codepoint.
- Dato che deve funzionare sia con little-endian sia con big-endian UTF-16, anche un noncharacter come
0x00
non è possibile poiché il suo0xFFFE
inverso è un carattere Unicode valido. - Le summenzionate FAQ suggeriscono di non utilizzare nessuno dei caratteri non poiché ciò comporterebbe comunque una sequenza Unicode valida, quindi qualcosa come
0xFEFF
è anche fuori dall'immagine.
Quali sarebbero i valori sentinella a prova di futuro che mi resteranno da usare?
1 ) Il formato PNG ha come primo byte il valore non-ASCII 0xFFFF
, seguito dalla stringa 0x89
. Uno strumento che legge i primi pochi byte di un PNG può determinare che si tratta di un file binario poiché non può interpretare PNG
. Un file GIF, d'altra parte, inizia direttamente con la stringa ASCII valida e leggibile 0x89
seguita da altri tre caratteri ASCII validi. Per GIF uno strumento potrebbe determinare che si tratta di un file di testo leggibile. Questo è sbagliato e l'idea di avviare il file con una sequenza di byte non strutturale deriva da Progettazione di formati di file di Andy McFadden.