34 puntos por GN⁺ 2025-09-13 | Aún no hay comentarios. | Compartir por WhatsApp
  • 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.

Aún no hay comentarios.