Jump to content
Sign in to follow this  
fredericopissarra

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

Recommended Posts

Posted (edited)

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

 

 

Edited by fredericopissarra

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...