El estándar Unicode tiene suficientes puntos de código que necesita 4 bytes para almacenarlos todos. Eso es lo que hace la codificación UTF-32. Sin embargo, la codificación UTF-8 de alguna manera los comprime en espacios mucho más pequeños al usar algo llamado "codificación de ancho variable".
De hecho, logra representar los primeros 127 caracteres de US-ASCII en un solo byte que se ve exactamente como ASCII real, por lo que puede interpretar una gran cantidad de texto ascii como si fuera UTF-8 sin hacerle nada. Buen truco. ¿Entonces, cómo funciona?
Voy a hacer y responder mi propia pregunta aquí porque acabo de leer un poco para resolverlo y pensé que podría ahorrarle tiempo a alguien más. Además, tal vez alguien pueda corregirme si me equivoco.
fuente
Respuestas:
Cada byte comienza con unos pocos bits que le indican si es un punto de código de un solo byte, un punto de código de varios bytes o una continuación de un punto de código de varios bytes. Me gusta esto:
Los puntos de código de múltiples bytes comienzan cada uno con unos pocos bits que esencialmente dicen "oye, también necesitas leer el siguiente byte (o dos, o tres) para averiguar qué soy". Son:
Finalmente, los bytes que siguen a esos códigos de inicio se ven así:
Dado que puede saber qué tipo de byte está mirando desde los primeros bits, incluso si algo se estropea en algún lugar, no pierde toda la secuencia.
fuente
next char is continuation
? Si obtuviéramos un carácter de 3 bytes, sería como:,1xxxxxxx 1xxxxxxx 0xxxxxxx
por lo que se desperdiciaría menos espacio.RFC3629 - UTF-8, un formato de transformación de ISO 10646 es la autoridad final aquí y tiene todas las explicaciones.
En resumen, varios bits en cada byte de la secuencia de 1 a 4 bytes codificada en UTF-8 que representa un solo carácter se utilizan para indicar si es un byte final, un byte inicial y, de ser así, cuántos bytes siguen. Los bits restantes contienen la carga útil.
fuente
Extracto del mínimo absoluto que todo desarrollador de software debe conocer absoluta y positivamente sobre Unicode y conjuntos de caracteres (¡sin excusas!)
fuente