Byte-order Mark (BOM)

Byte-order Mark (BOM)

Overview

Neste post, vamos desbravar o mundo misterioso do Byte Order Mark (BOM), um pequeno, porém poderoso, detalhe que faz uma grande diferença na forma como os caracteres são lidos e apresentados em um arquivo. Com uma pitada de humor e muita informação, prepare-se para entender por que alguns caracteres se transformam em ‘interrogações’ sem ele e como o BOM nos ajuda a evitar essas situações constrangedoras. Seja você um entusiasta da codificação ou simplesmente curioso, este guia irá iluminar um aspecto fundamental da computação que muitas vezes passa despercebido.

O byte-order mark (BOM) é um caractere Unicode (U+FEFF byte Order Mark – BOM), que aparece como um número mágico no inicio do arquivo e indicam para o programa qual tipo de caracteres devem ser utilizados.

Sem isso, ao abrir o arquivo, caracteres “quebrados” podem aparecer como, por exemplo, as ? que aparecem no lugar de uma letra com acento.

Os números mágicos são comuns em programas em muitos sistemas operacionais. Números mágicos implementam dados fortemente tipados e são uma forma de sinalizar os tipos de dados para o programa está recebendo o arquivo.

Exemplo: Arquivos GIF tem o código ASCII para “GIF89a” (4749 46 38 39 61) ou “GIF87a” (47 49 46 38 37 61)

Apesar de ser opcional, quando utilizado, o BOM irá aparecer no inicio do arquivo

Unicode pode ser codificado como integers de 8 bits, 16 bits ou 32 bits. Para as representações de 16 e 32 bits, um programa lendo o arquivo texto precisa saber em qual byte-order os integers foram codificados. Como o BOM em si é codificado no mesmo esquema que o resto do documento e tem um valor conhecido, programa pode examinar esses primeiros bytes alguns para determinar a codificação.

CodificaçãoRepresentação HexadecimalRepresentação DecimalBytes como caracteres CP1252
UTF-8EF BB BF239 187 191
UTF-16 (BE)FE FF254 255þÿ
UTF-16 (LE)00 00 FE FF0 0 254 255␀␀þÿ (␀ se refere ao caractere null de ASCII)
UTF-32 (BE)FF FE 00 00255 254 0 0ÿþ␀␀ (␀ se refere ao caractere null de ASCII)
UTF-72B 2F 76 38 2B 2F 76 39 2B 2F 76 2B 2B 2F 76 2F 2B 2F 76 38 2D43 47 118 56 43 47 118 57 43 47 118 43 43 47 118 47 43 47 118 56 45+/v8 +/v9 +/v+ +/v/ +/v8-
UTF-1F7 64 4C247 100 76÷dL
UTF-EBCDICDD 73 66 73221 115 102 115Ýsfs
SCSU0E FE FF14 254 255␎þÿ (␎ representa o caractere “shift out” do ASCII)
BOCU-1FB EE 28251 238 40ûî(
GB-1803084 31 95 33132 49 149 51„1•3

Versão tl;dr: São os caracteres que contam a codificação do arquivo para o programa. Sem ele, você corre o risco de ver caracteres “estranhos” na hora que abrir o arquivo.