Ya hemos visto como almacenar números enteros positivos y negativos, y números fraccionarios. Pero nuestros programas no solo van a tener números. Generalmente, también tendremos textos.
La representación de textos es uno de los quebraderos de cabeza de la informática desde sus orígenes. Lo vimos al hablar de Bytes, y Char, la codificación de textos fue un auténtico problema a resolver desde los primeros ordenadores.
Los caracteres o “letras” son un conjunto de símbolos que usamos para comunicarnos. Son un conjunto bastante extenso, que incluye letras mayúsculas, minúsculas, signos de puntuación, los propios dígitos del sistema decimal.
Afortunadamente ya lo tenemos muy superado, y casi nunca deberás preocuparte por ello demasiado. Pero, conviene que sepas cómo se codifican y se trabaja con ello (porque seguro que en algún momento lo necesitas).
Al hablar de números podríamos jugar con forma de representación. Al final, era un cambio de base. Pero al hablar de caracteres no queda otra que usar una tabla de traducción (ESTE número binario, se corresponde con ESTA letra).
Así que este problema se encontraron cuando empezaban a desarrollarse los primeros ordenadores. Dijeron, ¿Cómo de grande necesito que sea esa tabla? ¿Cuántos dígitos en binario necesito?
Y así surge la tabla ASCII 👇
Representación ASCII
El ASCII (American Standard Code for Information Interchange) es un estándar de codificación que data de 1963, que asigna un número entero único a cada carácter en el conjunto básico de caracteres ingleses.
Cada carácter ASCII se representa mediante un valor numérico de 7 bits, lo que permite un total de 128 caracteres diferentes.
Por ejemplo, el caracter ‘A’ tiene un valor ASCII de 65, que se representa en binario como 01000001.
Los primeros 31 caracteres de la tabla ASCII son caracteres de control, que son interpretados por el ordenador.
Dec | Char |
---|---|
0 | NUL (null) |
1 | SOH (start of heading) |
2 | STX (start of text) |
3 | ETX (end of text) |
4 | EOT (end of transmission) |
5 | ENQ (enquiry) |
6 | ACK (acknowledge) |
7 | BEL (bell) |
8 | BS (backspace) |
9 | TAB (horizontal tab) |
10 | LF (NL line feed, new line) |
11 | VT (vertical tab) |
12 | FF (NP form feed, new page) |
13 | CR (carriage return) |
14 | SO (shift out) |
15 | SI (shift in) |
16 | DLE (data link escape) |
17 | DC1 (device control 1) |
18 | DC2 (device control 2) |
19 | DC3 (device control 3) |
20 | DC4 (device control 4) |
21 | NAK (negative acknowledge) |
22 | SYN (synchronous idle) |
23 | ETB (end of trans. block) |
24 | CAN (cancel) |
25 | EM (end of medium) |
26 | SUB (substitute) |
27 | ESC (escape) |
28 | FS (file separator) |
29 | GS (group separator) |
30 | RS (record separator) |
31 | US (unit separator) |
Los restantes son letras y símbolos, según
Dec | Char |
---|---|
32 | SPACE |
33 | ! |
34 | ” |
35 | # |
36 | $ |
37 | % |
38 | & |
39 | ’ |
40 | ( |
41 | ) |
42 | * |
43 | + |
44 | , |
45 | - |
46 | . |
47 | / |
48 | 0 |
49 | 1 |
50 | 2 |
51 | 3 |
52 | 4 |
53 | 5 |
54 | 6 |
55 | 7 |
56 | 8 |
57 | 9 |
58 | : |
59 | ; |
60 | < |
61 | = |
62 | > |
63 | ? |
Dec | Char |
---|---|
64 | @ |
65 | A |
66 | B |
67 | C |
68 | D |
69 | E |
70 | F |
71 | G |
72 | H |
73 | I |
74 | J |
75 | K |
76 | L |
77 | M |
78 | N |
79 | O |
80 | P |
81 | Q |
82 | R |
83 | S |
84 | T |
85 | U |
86 | V |
87 | W |
88 | X |
89 | Y |
90 | Z |
91 | [ |
92 | \ |
93 | ] |
94 | ^ |
95 | _ |
Dec | Char |
---|---|
96 | ` |
97 | a |
98 | b |
99 | c |
100 | d |
101 | e |
102 | f |
103 | g |
104 | h |
105 | i |
106 | j |
107 | k |
108 | l |
109 | m |
110 | n |
111 | o |
112 | p |
113 | q |
114 | r |
115 | s |
116 | t |
117 | u |
118 | v |
119 | w |
120 | x |
121 | y |
122 | z |
123 | { |
124 | | |
125 | } |
126 | ~ |
127 | DEL |
Estos valores numéricos se pueden representar en sistema binario, lo que permite que los caracteres ASCII sean procesados por las computadoras de manera eficiente
Extended ASCII table
La tabla ASCII era muy limitada en cuanto a caracteres. Afortunadamente, la informática ya era normal que un Byte fueran 8 bits. De estos, ASCII sólo usaba 7bits, por lo que quedaban otros 128 caracteres para ampliarlo.
La tabla ASCII extendida es una extensión del estándar ASCII que aumenta el número de caracteres a 256 (del 128 al 255). Esto incluye caracteres adicionales como letras acentuadas, símbolos especiales, letras y caracteres utilizados en otros idiomas además del inglés (como el español, francés, alemán, entre otros).
La tabla ASCII extendida no es un estándar oficial único, sino que hay varias variantes que asignan diferentes caracteres a los códigos del 128 al 255. Algunas de las variantes más comunes son ISO 8859-1 (también conocida como Latin-1), ISO 8859-15 (Latin-9), Windows-1252, entre otras.
Unicode
A medida que la informática se volvía más global, el conjunto de caracteres ASCII (ni siquiera la versión extendida) resultaba insuficiente para representar todos los caracteres utilizados en diferentes idiomas y sistemas de escritura.
Para abordar esta limitación, se desarrolló Unicode, un estándar de codificación que asigna un código único a cada carácter utilizado en cualquier idioma del mundo.
Por ejemplo, el caracter ’✓’ tiene un valor Unicode de U+2713, que se representa en binario como 0010 0111 0001 0011
Unicode utiliza una representación de 16 bits (o más) para cada carácter, lo que permite la representación de un conjunto mucho más amplio de caracteres. Por compatibilidad, los primeros 128 caracteres Unicode son idénticos al conjunto de caracteres ASCII.
Actualmente la tabla Unicode tiene unos 150 mil caracteres codificados. Eso significa que también agotamos los 16bits (que llegarían hasta 65.536 caracteres). Y aquí es donde entra en juego UTF.
Progresivamente, el sistema Unicode se ha ido revisando y ampliando para introducir más y más (y más) caracteres.
Unicode 1.0 (1991): La primera versión oficial de Unicode, que incluía 24,000 caracteres.
Unicode 1.1 (1993): Agregó 10,000 caracteres adicionales.
Unicode 2.0 (1996): Una revisión mayor que agregó la capacidad para soportar escrituras bidireccionales (como árabe y hebreo), además de agregar otros 35,000 caracteres.
Unicode 3.0 (1999): Incorporó un gran número de caracteres adicionales para dar soporte a idiomas como el chino, japonés y coreano, junto con muchos otros símbolos y caracteres técnicos.
Unicode 3.1 (2001): Introdujo cambios menores y correcciones de errores.
Unicode 3.2 (2002): Incluyó mejoras en el manejo de escrituras bidireccionales y cambios en la codificación.
Unicode 4.0 (2003): Agregó más de 96,000 caracteres adicionales, incluyendo muchos ideogramas para lenguajes asiáticos.
Unicode 4.1 (2005): Introdujo algunas mejoras técnicas y nuevas normas para la codificación.
Unicode 5.0 (2006): Agregó alrededor de 6,000 caracteres adicionales, incluyendo muchos símbolos matemáticos y técnicos.
Unicode 5.1 (2008): Una versión menor con algunas correcciones y clarificaciones.
Unicode 5.2 (2009): Agregó aproximadamente 800 caracteres nuevos, incluyendo caracteres para matemáticas y lenguajes minoritarios.
Unicode 6.0 (2010): Introdujo soporte para la escritura en caracteres emoji, además de añadir muchos nuevos caracteres.
Unicode 6.1 (2012): Añadió alrededor de 7,000 nuevos caracteres, incluyendo muchos símbolos para matemáticas y música.
Unicode 6.2 (2012): Introdujo soporte para caracteres birmanos y kaithi, además de otros nuevos.
Unicode 6.3 (2013): Agregó soporte para caracteres tibetanos y algunas otras mejoras.
Unicode 7.0 (2014): Introdujo alrededor de 2,834 caracteres nuevos, incluyendo muchos para lenguajes minoritarios y símbolos.
Unicode 8.0 (2015): Añadió aproximadamente 7,716 caracteres nuevos, incluyendo soporte para lenguas como el Cherokee y el Meitei Mayek.
Unicode 9.0 (2016): Introdujo alrededor de 7,500 caracteres adicionales, incluyendo el soporte para el nuevo estándar de emoji.
Unicode 10.0 (2017): Agregó más de 8,500 caracteres nuevos, incluyendo glifos para lenguas del Caúcaso y símbolos emoji.
Unicode 11.0 (2018): Introdujo alrededor de 7,864 nuevos caracteres, incluyendo glifos para el alfabeto sindhi y emoji adicionales.
Unicode 12.0 (2019): Agregó más de 137,000 caracteres nuevos, incluyendo soporte para el alfabeto egipcio antiguo y muchos símbolos nuevos.
Unicode 12.1 (2019): Una versión menor con algunas correcciones y mejoras.
Unicode 13.0 (2020): Añadió alrededor de 5,930 caracteres nuevos, incluyendo nuevos emoji y símbolos.
Unicode 14.0 (2021): Introdujo alrededor de 5,280 caracteres nuevos, incluyendo nuevos emoji y caracteres de lenguas minoritarias.
Unicode 15.0 (2022): Añadió 17,189 caracteres nuevos, incluyendo nuevos emoji, glifos para lenguas africanas y símbolos técnicos.
Codificación UTF
Unicode y UTF (Unicode Transformation Format) están estrechamente relacionados, pero son conceptos diferentes:
Unicode: Es un estándar de codificación de caracteres que asigna un número único a cada carácter en casi todos los sistemas de escritura conocidos en el mundo, incluyendo letras, números, símbolos y caracteres especiales. Por ejemplo, la letra “A” tiene un número único en Unicode, así como cualquier otro carácter que puedas imaginar.
UTF (Unicode Transformation Format): Es una forma de codificar los puntos de código de Unicode en secuencias de bytes. UTF define cómo estos puntos de código Unicode se almacenan en la memoria de una computadora o se transmiten a través de una red.
Existen varias variantes de UTF, como UTF-8, UTF-16, y UTF-32, que difieren en cómo representan los caracteres Unicode como secuencias de bytes.
Ahora, en cuanto a la cantidad de bytes que utiliza Unicode:
UTF-8: Es el más común y ampliamente utilizado. En UTF-8, cada carácter Unicode se representa usando 1, 2, 3 o 4 bytes. Los caracteres ASCII (los primeros 128 caracteres de Unicode) se representan con 1 byte en UTF-8, lo que significa que es compatible con ASCII. Los caracteres adicionales de Unicode utilizan más bytes según su rango.
UTF-16: Cada carácter Unicode se representa en UTF-16 usando 2 o 4 bytes. Los caracteres de Unicode que están en el rango “BMP” (Plano Multilingüe Básico) se representan con 2 bytes, mientras que los caracteres fuera del BMP utilizan 4 bytes.
UTF-32: Es el formato más simple, ya que asigna cada carácter Unicode exactamente a 4 bytes. Esto significa que cualquier carácter Unicode, sin importar su rango, se representará con 4 bytes en UTF-32.
En resumen, la cantidad de bytes que ocupa un carácter Unicode depende del formato de UTF que se esté utilizando:
- UTF-8: 1 a 4 bytes por carácter
- UTF-16: 2 o 4 bytes por carácter
- UTF-32: Siempre 4 bytes por carácter
Por lo tanto, la respuesta a cuántos bytes tiene Unicode depende del formato de UTF que se esté utilizando para codificarlo.