fredericopissarra Posted May 10, 2019 Posted May 10, 2019 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":
fredericopissarra Posted May 11, 2019 Author Posted May 11, 2019 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...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.