Com\’è dura la professione!

12 maggio 2008

Lo strano caso del BOM

Filed under: Programmazione — lbell @ 21:07
Tags: , , ,

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

1 commento »

  1. 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 | Rispondi


RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.

%d blogger cliccano Mi Piace per questo: