Códigos mayores que 127 se codifican en varios octetos.
Por otro lado, si nuestro byte es negativo, esto significa que es probablemente un carácter codificado en UTF-8, cuyo código es mayor que 127.
Esto también significa que debe ir seguido de al menos un byte más negativo.
UTF-8 está diseñado para codificar cualquier carácter Unicode utilizando el menor espacio posible.
Si es posible codificar un carácter Unicode en sólo 2 bytes, no utilizaremos más de esos 2 bytes. Vamos a utilizar 4 bytes sólo si es absolutamente necesario.
Necesitamos un método para adivinar cuántos bytes es codificado en un personaje.
Podemos extraer esta información desde el primer byte negativo, contando cuántos de los últimos pedacitos de nuestro byte se fijan a uno:
110xxxxx: últimos 2 bits set a 1, significa que nuestro carácter está codificado en 2 bytes.
Tenemos que leer 1 byte negativos más.
1110xxxx: últimos 3 bits set a 1, significa que nuestro carácter está codificado en 3 bytes.
Tenemos que leer bytes negativos más 2.
11110xxx: últimos 4 bits set a 1, significa que nuestro carácter está codificado en 4 bytes.
Tenemos que leer 3 bytes negativos más.
El byte(s) extra negativos siguientes todos tiene el pedacito 8 a 1 (signo negativo) y el bit 7 en 0: 10yyyyyy
Si el byte(s) adicionales siguientes es positivos o su bit 7 a 1, esto significa que el UTF-8 codificados caracteres es incorrecto. Nuestra aplicación tiene absolutamente detectar codificación malformada.
Códigos de 128 a 2047 están codificados en 2 bytes.
(de 0x0100 a 0x7FFF)
Caracteres codificados en dos bytes son así:
110xxxxx, 10yyyyyy
Para decodificarlo, simplemente tenemos que agrupar nuestros pedacitos de 5 x con nuestros 6 y bits: xxxxxyyyyyy