- UTF-8 es un método de codificación de longitud variable que representa millones de caracteres mientras mantiene compatibilidad retroactiva con ASCII
- La misma región de 7 bits que ASCII (
U+0000~U+007F) usa 1 byte sin cambios, por lo que un archivo ASCII es también un archivo UTF-8 válido
- Los demás caracteres se representan con secuencias de 2 a 4 bytes; el patrón de bits del byte inicial define la longitud y los bytes siguientes comienzan con
10 para indicar que son bytes de continuación
- Gracias a este diseño, UTF-8 puede manejar un conjunto universal de caracteres y a la vez ser perfectamente compatible con los sistemas ASCII existentes, por eso se convirtió en la codificación de caracteres más usada
- Otras codificaciones Unicode como UTF-16 y UTF-32 no ofrecen esta compatibilidad con ASCII
La excelencia del diseño de UTF-8
- Cuando uno conoce UTF-8 por primera vez, impresiona mucho su estructura compatible con ASCII existente mientras integra en un solo sistema millones de caracteres de distintos idiomas y escrituras
- En esencia, UTF-8 aprovecha hasta 32 bits, pero ASCII solo usa 7 bits
- Los principios de diseño de UTF-8 son los siguientes
- Todo archivo codificado en ASCII es un archivo UTF-8 válido
- Todo archivo UTF-8 que solo contenga caracteres ASCII es un archivo ASCII válido
- La idea de fusionar un sistema antiguo limitado a apenas 128 caracteres con otro que abarca millones de caracteres fue realmente innovadora
Concepto básico de UTF-8
- UTF-8 es una codificación de caracteres de longitud variable (variable-width encoding) diseñada para representar todos los caracteres del conjunto Unicode
- Codifica cada carácter con 1 a 4 bytes
- Los primeros 128 caracteres (
U+0000~U+007F) se almacenan en un solo byte, lo que asegura compatibilidad retroactiva con ASCII
- Los demás caracteres se codifican en dos, tres o cuatro bytes
- Los bits iniciales del primer byte determinan el número total de bytes necesarios para la codificación
| Patrón de 1 byte |
Cantidad de bytes |
Patrón de la secuencia completa de bytes |
| 0xxxxxxx |
1 |
0xxxxxxx (ASCII común) |
| 110xxxxx |
2 |
110xxxxx 10xxxxxx |
| 1110xxxx |
3 |
1110xxxx 10xxxxxx 10xxxxxx |
| 11110xxx |
4 |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
- El 2.º, 3.º y 4.º byte de una secuencia multibyte siempre comienzan con
10, lo que marca claramente que son bytes de continuación
- Al combinar los bits restantes del byte principal y de los bytes de continuación, se forma un code point
- Un code point es un identificador único de un carácter Unicode, representado con el prefijo "U+" y en hexadecimal
- Ejemplo: el code point de "A" es
U+0041
- El flujo para interpretar un carácter a partir de bytes codificados en UTF-8 es el siguiente
- 1. Se lee un byte y, si empieza con 0, se considera un carácter de un solo byte (ASCII); se usa el resto de los 7 bits para representar el carácter y se pasa al siguiente byte
- 2. Si no empieza con 0, entonces
- si empieza con 110, es un carácter de 2 bytes y se lee 1 byte adicional
- si empieza con 1110, es un carácter de 3 bytes y se leen los siguientes 2 bytes
- si empieza con 11110, es un carácter de 4 bytes y se leen 3 bytes adicionales
- 3. De los bytes determinados, se combinan los bits restantes excluyendo los bits iniciales y se usan como valor binario del code point
- 4. Se busca el code point en el conjunto Unicode y se muestra en pantalla
- 5. Se repite con el siguiente byte
Ejemplo: el carácter hindi "अ"
- Representación en UTF-8:
11100000 10100100 10000101 (3 bytes)
- El primer byte (
11100000) → indica que es un carácter de 3 bytes
- Combinación de los bits válidos de los tres bytes →
00001001 00000101 = hexadecimal 0x0905
- El code point
U+0905 corresponde al carácter devanagari "अ"
Ejemplos de archivos
-
1. Hey👋 Buddy
- Consta de 13 bytes en total
- Caracteres ASCII (H, e, y, B, u, d, d, y, espacio) → 1 byte cada uno
- 👋 (U+1F44B) → 4 bytes
11110000 10011111 10010001 10001011
- Este archivo es un archivo UTF-8 válido, pero como incluye un carácter no ASCII (emoji), no es compatible retroactivamente con ASCII
-
2. Hey Buddy
- Tiene 9 bytes en total, todos dentro del rango ASCII
- Por lo tanto, este archivo es a la vez un archivo ASCII válido y un archivo UTF-8 válido
Comparación con otras codificaciones
- Existen algunas codificaciones que ofrecen compatibilidad con ASCII, pero ninguna se usa tanto como UTF-8
- GB18030 (estándar chino), por ejemplo, también ofrece compatibilidad con ASCII, pero no tiene un uso tan extendido
- La familia ISO/IEC 8859 es una extensión de un solo byte (máximo 256 caracteres), así que tiene limitaciones
- UTF-16/UTF-32 no tienen compatibilidad con ASCII
- 'A' (U+0041): en UTF-16 es
00 41, en UTF-32 es 00 00 00 41
Bonus: UTF-8 Playground
Aún no hay comentarios.