Un valore sentinella Unicode che posso usare?

15

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 suo 0xFFFE 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.

    
posta Daniel Pelsmaeker 13.03.2013 - 16:15
fonte

3 risposte

16

0xDC 0xDC

  • Ovviamente UTF-8 e ASCII non validi
  • Sostituisci percorso inaspettato in posizione di vantaggio indipendentemente dall'endianess in UTF-16. Non ottiene più UTF-16 non valido.
risposta data 13.03.2013 - 17:03
fonte
5
  • In UTF-8, i byte C0, C1 e F5 - FF sono illegali. Il primo byte deve essere ASCII o un byte nell'intervallo C2-F4, qualsiasi altro byte iniziale non è UTF-8 valido.

  • In UTF-16, il file normalmente inizia con il Byte Order Mark (U + FEFF), altrimenti le applicazioni devono indovinare nell'ordine dei byte. I punti del codice nell'intervallo D800-DBFF sono i byte iniziali per una coppia surrogata e DC00-DFFF sono i byte finali per una coppia surrogata.

Quindi, userei il byte combo F5DC . Questi due valori sono:

  • Non ASCII
  • Non valido UTF-8
  • O interpretato come un byte finale UTF-16 in una coppia surrogata (non legale), o il punto di codice U + F5DC, che è un carattere di uso privato, ma solo da applicazioni che testardamente cercano di interpretalo come UTF-16 anche senza un BOM.

Se hai bisogno di più opzioni, F5DD a F5DF hanno tutte le stesse 3 proprietà, come F6DC - F6DF , F7DC - F7DF e F8DC - F8DF , per un totale di 16 combinazioni di byte diverse tra cui scegliere.

    
risposta data 13.03.2013 - 17:27
fonte
1

Se stai cercando di usare un carattere non stampabile per indicare "non testo", allora ti sarà difficile battere 0x89:

  • È al di fuori dell'intervallo US-ASCII
  • In ISO-8859-1 è un carattere non stampabile ("TABULAZIONE DEL CARATTERE CON GIUSTIFICAZIONE"). Allo stesso modo con Shift-JIS, che credo sia ancora di uso comune. Altre codifiche a 8 bit possono tuttavia considerarlo un carattere valido.
  • In UTF-8 è un primo byte non valido per una sequenza multi-byte (i bit più alti sono 10, che sono riservati per i caratteri 2..N di una sequenza multi-byte)

Generalmente, quando si formano numeri magici, "non-testo" è un punto minore. Dovrò cercare il riferimento, ma uno dei formati grafici standard (TIFF, penso) ha qualcosa come sei diverse informazioni utili dal suo numero magico.

    
risposta data 14.03.2013 - 00:11
fonte

Leggi altre domande sui tag