fredericopissarra Posted May 10, 2019 Share Posted May 10, 2019 (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": Edited May 10, 2019 by fredericopissarra Quote Link to comment Share on other sites More sharing options...
fredericopissarra Posted May 11, 2019 Author Share 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... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.