Leggendo file con programmi scritti in C, un modo per distinguere se il file sia stato codificato in formato Unicode o ASCII senza avere a priori altre informazioni, è di controllare se nelle prime posizioni del file sia presente una sequenza di due byte che danno vita ai numeri esadecimali 0xFEFF o 0xFFFE. Per averne una conferma si provi a salvare un file di testo in formato Unicode con Notepad o Wordpad di Microsoft Windows e caricarlo con editor di testo che non supporta Unicode.
In effetti i due byte sono effettivamente un marker, un carattere Unicode specifico, il cui scopo è dichiarare l’ordine di codifica dei caratteri composti da più byte o, come si dice in inglese, l’endianness, e lo si può legalmente trovare anche nel formato UTF-8. Il suo nome è “Byte Order Mark” o BOM. Si tratta di una sequenza che nel formato Unicode è legale solo se letta in modo da assumere il valore esadecimale 0xFEFF. Il valore 0xFFFE è infatti un carattere illegale. Un programma, trovando questo carattere non rappresentabile graficamente e quindi inseribile senza problemi di alterazione in testo in formato Unicode, può capire se la codifica del file stesso è nel formato big endian o little endian. Lo standard Unicode inserisce il BOM tra i non caratteri (noncharacters); il BOM viene indicato anche come ‘Zero-Width Non-Breaking Space’
A dire il vero nel caso il file sia stato codificato in UTF-32 i byte da esaminare sarebbero quattro, ma il succo del discorso non cambierebbe.
La definizione del BOM:
FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;;
Qualche link sull’argomento:
http://en.wikipedia.org/wiki/Byte_Order_Mark
http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters
http://www.unicode.org/Public/UNIDATA/UnicodeData.txt

C’è da notare che questa tecnica è usata quasi esclusivamente in ambiente Windows. Su Linux tutti i sorgenti sono scritti in ASCII o in ISO 8859-1.
Commento di malex — 13 Maggio 2008 @ 8:17 |