que characters unicode utf-8 character-encoding multibyte

unicode - characters - ¿Cómo funciona el UTF-8 "codificación de ancho variable"?



utf-8 que es (3)

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 exprime en espacios mucho más pequeños mediante el uso de algo llamado "codificación de ancho variable".

De hecho, se las arregla para representar los primeros 127 caracteres de US-ASCII en un solo byte que se ve exactamente como ASCII real, por lo que puede interpretar un montón 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 salvar a alguien más en algún momento. Además, tal vez alguien me puede corregir si tengo algo de malo.



Cada byte comienza con algunos bits que le indican si se trata de 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:

0xxx xxxx A single-byte US-ASCII code (from the first 127 characters)

Los puntos de código multibyte cada uno comienzan con unos pocos bits que básicamente dicen "hey, también necesitas leer el siguiente byte (o dos, o tres) para descubrir lo que soy". Son:

110x xxxx One more byte follows 1110 xxxx Two more bytes follow 1111 0xxx Three more bytes follow

Finalmente, los bytes que siguen esos códigos de inicio se ven así:

10xx xxxx A continuation of one of the multi-byte characters

Como puedes decir qué tipo de bytes estás mirando desde los primeros bits, incluso si algo se destroza en alguna parte, no pierdes toda la secuencia.


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 se trata de un byte final, un byte inicial y, de ser así, cuántos bytes siguen. Los bits restantes contienen la carga útil.