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ção | Representação Hexadecimal | Representação Decimal | Bytes como caracteres CP1252 |
---|---|---|---|
UTF-8 | EF BB BF | 239 187 191 |  |
UTF-16 (BE) | FE FF | 254 255 | þÿ |
UTF-16 (LE) | 00 00 FE FF | 0 0 254 255 | ␀␀þÿ (␀ se refere ao caractere null de ASCII) |
UTF-32 (BE) | FF FE 00 00 | 255 254 0 0 | ÿþ␀␀ (␀ se refere ao caractere null de ASCII) |
UTF-7 | 2B 2F 76 38 2B 2F 76 39 2B 2F 76 2B 2B 2F 76 2F 2B 2F 76 38 2D | 43 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-1 | F7 64 4C | 247 100 76 | ÷dL |
UTF-EBCDIC | DD 73 66 73 | 221 115 102 115 | Ýsfs |
SCSU | 0E FE FF | 14 254 255 | ␎þÿ (␎ representa o caractere “shift out” do ASCII) |
BOCU-1 | FB EE 28 | 251 238 40 | ûî( |
GB-18030 | 84 31 95 33 | 132 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.