Introduction to Unicode and UTF-8

Unicode is an industry standard for consistent encoding of written text. Learn the basics and most important parts of it, in particular concerning UTF-8

Unicode esun estándar de la industria para la codificación consistente de texto escrito.

Hay muchos conjuntos de caracteres que utilizan las computadoras, pero Unicode es el primero de su tipo que apunta a admitir todos los lenguajes escritos en la tierra (¡y más allá!).

Su objetivo es proporcionar un número único para identificar cada carácter de cada idioma, en cualquier plataforma.

Unicode asigna cada carácter a un código específico, llamadopunto de código. Un punto de código toma la forma deU+<hex-code>, que van desdeU+0000aU+10FFFF.

Un punto de código de ejemplo se ve así:U+004F. Su significado depende de la codificación de caracteres utilizada.

Unicode define diferentescodificaciones de caracteressiendo los más utilizados UTF-8, UTF-16 y UTF-32.

UTF-8 es definitivamente la codificación más popular de la familia Unicode, especialmente en la Web. Este documento está escrito en UTF-8, por ejemplo.

Actualmente hay más de 135.000 caracteres diferentes implementados, con espacio para más de 1,1 millones.

Guiones

Todos los caracteres compatibles con Unicode se agrupan en secciones denominadasguiones.

Hay una secuencia de comandos para cada conjunto de caracteres diferente:

  • Latín (contiene todos los caracteres ASCII + todos los demás caracteres del mundo occidental)
  • coreano
  • Húngaro antiguo
  • hebreo
  • griego
  • armenio
  • …¡etcétera!

La lista completa se define en elNorma ISO 15924.

Ver más sobre guiones:https://en.wikipedia.org/wiki/Script_(Unicode)

Aviones

Además de los scripts, hay otra forma en que Unicode organiza sus caracteres:aviones.

En lugar de agruparlos por tipo, verifica el valor del punto de código:

Plano Abarcar
0 U + 0000 - U + FFFF
1 U + 10000 - U + 1FFFF
2 U + 20000 - U + 2FFFF
... ...
14 U + E0000 - U + EFFFF
15 U + F0000 - U + FFFFF
dieciséis U + 100000 - U + 10FFFF

Hay 17 aviones.

El primero es especial, se llamaPlano multilingüe básico, oBMP, y contiene la mayoría de los caracteres y símbolos modernos, de las escrituras latina, cirílica y griega.

Los otros 16 aviones se llamanplanos astrales. Vale la pena señalar que los aviones 3 a 13 están actualmente vacíos.

Los puntos de código contenidos en los planos astrales se denominanpuntos de código astral.

Los puntos de código astral son todos puntos superiores aU+10000.

Unidades de código

Los puntos de código se almacenan internamente comounidades de código. Una unidad de código es la representación de bits de un carácter y su longitud varía según la codificación del carácter.

UTF-32 usa una unidad de código de 32 bits.

UTF-8 usa una unidad de código de 8 bits y UTF-16 usa una unidad de código de 16 bits. Si un punto de código necesita un tamaño mayor, estará representado por 2 (o más, en UTF-8) unidades de código.

Grafemas

Un grafema es un símbolo que representa una unidad de un sistema de escritura. Es básicamentetu ideade un personaje y cómo debería verse.

Glifos

Un glifo es una representación gráfica de un grafema: cómo se muestra visualmente en la pantalla, la apariencia real en la pantalla.

Secuencias

Unicode le permite combinar diferentes caracteres para formar un grafema.

Por ejemplo, es el caso de los caracteres acentuados: la letraése puede expresar usando una combinación de la letrae(U+0065) y el carácter Unicode llamado "COMBINAR ACENTO AGUDO" (U+0301):

"U+0065U+0301" ➡️ "é"

U+0301en este caso es lo que se describe como unmarca de combinación, un carácter que se aplica al anterior para formar un grafema diferente.

Normalización

A veces, los caracteres se pueden representar mediante diferentes combinaciones de puntos de código.

Por ejemplo, es el caso de los caracteres acentuados: la letraése puede expresar tanto comoU+00E9y también como combinare(U+0065) y el carácter Unicode llamado "COMBINAR ACENTO AGUDO" (U+0301):

U+00E9       ➡️ "é"
U+0065U+0301 ➡️ "é"

El proceso de normalización analiza una cadena para ese tipo de ambigüedades y genera una cadena con la representación canónica de cualquier carácter.

Sin normalización, las cadenas perfectamente iguales para el ojo se considerarán diferentes porque su representación interna cambia:

Emojis

Los emojis son caracteres Unicode del plano astral y proporcionan una forma de tener imágenes en la pantalla sin tener imágenes reales, solo glifos de fuente.

Como ejemplo, el símbolo 🐶 se codifica comoU+1F436.

Los primeros 128 caracteres

Los primeros 128 caracteres de Unicode son los mismos que el conjunto de caracteres ASCII.

Los primeros 32 caracteres,U+0000-U+001F(0-31) se llamanCódigos de control.

Son una herencia del pasado y la mayoría de ellos ahora están obsoletos. Fueron utilizados para máquinas de teletipo, algo que existía antes del fax.

Los caracteres de U + 0020 (32) a U + 007E (126) contienen números, letras y algunos símbolos:

Unicode código ASCII Glifo
U + 0020 32 (espacio)
U + 0021 33 !
U + 0022 34 "
U + 0023 35 #
U + 0024 36 PS
U + 0025 37 %
U + 0026 38 Y
U + 0027 39 '
U + 0028 40 (
U + 0029 41 )
U + 002A 42 *
U + 002B 43 +
U + 002C 44 ,
U + 002D 45 -
U + 002E 46 .
U + 002F 47 /
U + 0030 48 0
U + 0031 49 1
U+0032 50 2
U+0033 51 3
U+0034 52 4
U+0035 53 5
U+0036 54 6
U+0037 55 7
U+0038 56 8
U+0039 57 9
U + 003A 58 :
U + 003B 59 ;
U + 003C 60 <
U + 003D 61 =
U + 003E 62 >
U + 003F 63 ?
U+0040 64 @
U+0041 65 A
U+0042 66 B
U+0043 67 C
U+0044 68 D
U+0045 69 mi
U+0046 70 F
U+0047 71 GRAMO
U+0048 72 H
U+0049 73 I
U + 004A 74 J
U + 004B 75 K
U + 004C 76 L
U + 004D 77 METRO
U + 004E 78 norte
U + 004F 79 O
U+0050 80 PAG
U+0051 81 Q
U+0052 82 R
U+0053 83 S
U+0054 84 T
U+0055 85 U
U+0056 86 V
U+0057 87 W
U+0058 88 X
U+0059 89 Y
U + 005A 90 Z
U + 005B 91 [
U + 005C 92
U + 005D 93 ]
U + 005E 94 ^
U + 005F 95 _
U+0060 96 '
U+0061 97 a
U+0062 98 B
U+0063 99 C
U+0064 100 D
U+0065 101 mi
U+0066 102 F
U+0067 103 gramo
U+0068 104 h
U+0069 105 I
U + 006A 106 j
U + 006B 107 k
U + 006C 108 l
U + 006D 109 metro
U + 006E 110 norte
U + 006F 111 o
U+0070 112 pag
U+0071 113 q
U+0072 114 r
U+0073 115 s
U+0074 116 t
U+0075 117 tu
U+0076 118 v
U+0077 119 w
U+0078 120 X
U+0079 121 y
U + 007A 122 z
U + 007B 123 {
U + 007C 124
U + 007D 125 }
U + 007E 126 ~
  • Los números van deU+0030aU+0039
  • Las letras mayúsculas van deU+0041aU+005A
  • Las letras minúsculas van deU+0061aU+007A

U + 007F (127) es el carácter de eliminación.

Todo lo que sigue está fuera del ámbito de ASCII y es parte de Unicode exclusivamente.

Puedes encontrar la lista completa en Wikipedia:https://en.wikipedia.org/wiki/List_of_Unicode_characters

Codificaciones Unicode

UTF-8

UTF-8 es una codificación de caracteres de ancho variable y puede codificar todos los caracteres cubiertos por Unicode, utilizando de 1 a 4 bytes de 8 bits.

Fue diseñado originalmente por Ken Thompson y Rob Pike en 1992. Esos nombres son familiares para aquellos con algún interés en el lenguaje de programación Go, ya que también fueron dos de los creadores originales de eso.

El W3C lo recomienda como la codificación predeterminada en archivos HTML, y las estadísticas indican que se usa en el 91,3% de todas las páginas web, a partir de abril de 2018.

En el momento de su introducción, ASCII era la codificación de caracteres más popular en el mundo occidental. En ASCII, a todas las letras, dígitos y símbolos se les asignó un número, y este número. Fijado en 8 bits, solo podía representar un máximo de 255 caracteres, y era suficiente.

UTF-8 fue diseñado para ser compatible con ASCII. Esto fue muy importante para su adopción, ya que ASCII era mucho más antiguo (1963) y estaba muy extendido, y el cambio a UTF-8 fue casi transparente.

Los primeros 128 caracteres de UTF-8 se asignan exactamente a ASCII. ¿Por qué 128? Porque ASCII usa codificación de 7 bits, lo que permite hasta 128 combinaciones. ¿Por qué 7 bits? Ahora damos por sentado los 8 bits, pero en el día en que se concibió ASCII, los sistemas de 7 bits también eran populares.

Al ser 100% compatible con ASCII, UTF-8 también es muy eficiente, porque los caracteres más utilizados en los idiomas occidentales están codificados con solo 1 byte.

Aquí está el mapa del uso de bytes:

Número de bytes Comienzo Fin
1 U+0000 U+007F
2 U+0080 U+07FF
3 U+0800 U+FFFF
4 U+10000 U+10FFFF

¿Recuerda que en ASCII los caracteres estaban codificados como números? Si la cartaAen ASCII se representó con el número65, usando UTF-8 está codificado comoU+0041.

Por qué noU+0065¿usted pregunta? Bueno, porque Unicode usa una base hexadecimal, y en lugar de10tú tienesU+000Ay así sucesivamente (básicamente, tienes un conjunto de 16 dígitos en lugar de 10)

Echa un vistazo aeste video, que explica brillantemente esta compatibilidad UTF-8 y ASCII.

UTF-16

UTF-16 es otra codificación Unicode muy popular. Por ejemplo, es la forma en que Java representa internamente cualquier carácter. Es tambiénuna de las 2 codificaciones que JavaScript usa internamente, junto conUCS-2. También lo utilizan muchos otros sistemas, como Windows.

UTF-16 es un sistema de codificación de longitud variable, como UTF-8, pero utiliza 2 bytes (16 bits) como mínimo para cualquier representación de caracteres. Como tal, es incompatible con el estándar ASCII.

Los puntos de código en el plano multilingüe básico (BMP) se almacenan utilizando 2 bytes. Puntos de código enplanos astralesse almacenan utilizando 4 bytes.

UTF-32

UTF-8 usa un mínimo de 1 byte, UTF-16 usa un mínimo de 2 bytes.

UTF-32 siempre usa 4 bytes, sin optimizar el uso del espacio y, como tal, desperdicia mucho ancho de banda.

Esta restricción hace que sea más rápido operar porque tiene menos para verificar, ya que puede asumir 4 bytes para todos los caracteres.

No es tan popular como UTF-8 y UTF-16, pero tiene sus aplicaciones.


Más tutoriales de js: