Jump to content

Construíndo o código UTF-8 "na unha"...


fredericopissarra

Recommended Posts

Posted

Eis um macete (de fato, faz parte da especificação)... Um código UTF-8 pode ter de 1 a 6 bytes de tamanho. Um código UNICODE pode ter até 31 bits de tamanho e, para a codificação UTF-8 é dividido assim:

De 0x00 até 0x7F (7 bits):            0b0xxxxxxx
De 0x080 até 0x7FF (11 bits):         0b110xxxxx 0b10xxxxxx
De 0x0800 até 0xFFFF (16 bits):       0b1110xxxx 0b10xxxxxx 0b10xxxxxx
De 0x10000 até 0x1FFFFF (21 bits):    0b11110xxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx
De 0x200000 até 0x3FFFFFF (26 bits):  0b111110xx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx
De 0x400000 até 0x7FFFFFFF (31 bits): 0b1111110x 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx

Fica fácil perceber que o primeiro byte, quanto tiver seu MSB=1, segue a quantidade de bytes extras tantos quantos forem os bits setados antes do zero... 0b110xxxxx tem o MSB=1 e 1 bit setado antes do bit zerado., portanto, 1 byte extra... 0b111110xx tem o MSB=1 e 4 bits setados antes do bit zerado, portanto 4 bytes extras... Os bytes extras são sempre precedidos de 0b10...

Agora, tomemos um código UNICODE qualquer, por exemplo o do (adoro café!)... Esse é U+2615. 2615 está em hexadecimal e tem 14 bits, sendo que os bytes extras comportam apenas 6, isso significa que 12 bits serão distribuídos em 2 bytes e os 2 bits restantes no primero... Assim, o primeiro byte  começa com 0b1110 e os 4 bits restantes são os bits mais altos do código... Tendo 12 bits nos bytes extras e 4 no primeiro byte é só preencher os bits mais à esquerda com zeros... Assim, 0x2615 (0b0010_0110_0001_0101) é rearranjado para 0b0010_011000_010101). Colocando tudo no lugar temos: 0b11100010 0b10011000 0b10010101. Em hexadecimal: "\xE2\x98\x95":

Untitled.png.6957123dc95ebbeb4b7b07fe8b6f0c20.png

 

 

Posted

PS: UTF-16 é mais complicado e UTF-32 é mais simples de todos...
Mas, ambos dependem de endianess. Existe o UTF-16LE (little endian) e o UTF-16BE (big endian), bem como uma marca especial chamada BOM (Byte Order Mark) que pode preceder um caracter UTF-16. Se não for especificado, UTF-16 é big endian... O UTF-32, ao que parece, é semre BIG ENDIAN...

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...