Codificaciones de texto: lo que todo ingeniero de software debe saber

Sabemos que las computadoras entienden binario que es como 010101.

Si yo digo “Hola Mundo 123” la computadora dirá exactamente la misma línea que
“01001000 01100101 01111001 00100000 00110001 00110010 00110011”

en ingles es A y en el lenguaje de la computadora (Binario) es “01000001”

Igualmente, B es “01001000” en binario. Los 0 y los 1 se llaman bits. Un bit puede ser 0 o 1.

Definición – Codificación significa convertir datos en una forma codificada.

Supongamos que tenemos una cadena “Hola Mundo”. Ahora Para guardar/transmitir estos datos necesita ser codificado usando algún tipo de esquema de codificación para que las computadoras puedan recibirlo/enviarlo/leerlo/escribirlo. Hay muchos esquemas de codificación y discutiremos algunos importantes en esta publicación de blog.

En el pasado, los programas informáticos estaban programados para entender solo inglés (de la A a la Z, de la A a la Z), del 0 al 9, algunos signos de puntuación y muchos otros caracteres como espacio, retorno, retroceso, etc. Un total de 128 de estos caracteres. Esto fue llamado el conjunto de caracteres ASCII. Fueron codificados usando el Codificación ASCII esquema.

Conjunto de caracteres

Es básicamente una lista de caracteres que se pueden formar utilizando un esquema de codificación particular. Por ejemplo, a continuación se muestra una tabla del juego de caracteres ASCII.

Representación de bits (usando codificación ASCII)Valor
01000001A
01000010B
01000011C
01000100D
01000101mi
01000110F
…122 Más

Todo iba bien hasta que el internacionalización de Internet sucedió y comenzó a ganar popularidad en otros países además de América. La gente quería usar Internet en sus idiomas nativos, pero Conjunto de caracteres ASCII no proporciona caracteres en otros idiomas.

Si alguien te hubiera enviado un correo electrónico en ese momento en francés que dice C'est génial probablemente hubieras recibido
C'est g�nial porque la codificación ASCII no entiende la letra de acento é ya que no es capaz de codificarlo.

Pero ¿Por qué ASCII no entiende estos otros caracteres?

Si es una especificación, ¿por qué no podemos extenderla?

Aunque la codificación ASCII representa cada carácter en su conjunto de caracteres con 8 bits. Solo hace uso de la primeros 7 bits. [See the table above] El último bit siempre es 0.

2^7 = 128 (Número total de caracteres admitidos en ASCII)

Y eso es todo. ASCII no puede admitir más caracteres que eso.

2^8 = 256 (Número total de caracteres que pueden admitir 8 bits)

Esto dio a los desarrolladores la oportunidad de ampliar el conjunto de caracteres y admitir más
caracteres de otros idiomas.

Una cosa era segura: 8 bits (1 byte) no son suficientes para admitir todos los idiomas del planeta. Entonces, mientras tanto, también surgieron otros esquemas de codificación que usan más de un byte para representar caracteres de diferentes idiomas como chino, hindi, latín, etc.

Unicode

Luego vino Unicode, que unificó todas las diferentes representaciones de caracteres. Unicode puede representar básicamente cualquier carácter que puedas imaginar.

Entonces, lo primero que me viene a la mente es que podría estar usando tal vez 32 bits (4 bytes) para representar cada uno de sus caracteres y esa podría ser la razón por la que es capaz de admitir tantos caracteres. Pero eso no es cierto. De hecho, no usa bytes para representar caracteres. No tiene que hacerlo. Utiliza algo conocido como puntos de código.

Puntos de código

Los puntos de código son básicamente una asignación de números a caracteres y estos números se denominan puntos de código.

Punto de códigoValor
491
sesenta y cincoA
66B
67C
1245жї
9731

Ahora cuando dije Unicode no tiene que usar bytes para representar sus caracteres lo que quise decir es que Unicode en realidad no es un esquema de codificación.

Unicode es solo una forma abstracta de representar caracteres. No es una codificación.

Hay otras formas diferentes de codificar estos puntos de código Unicode en bits (para guardar en disco o memoria) y Unicode no proporciona una solución a eso. Afortunadamente, tenemos esquemas de codificación para codificar la representación de caracteres Unicode.

Unicode es una tabla grande que asigna caracteres a números y los diferentes UTF
Las codificaciones especifican cómo se codifican estos números como bits.

Pero, ¿por qué no podemos usar 4 bytes para representar cada carácter?

Podremos soportar 4,294,967,296 caracteres y eso es todo lo que necesitamos.

4 bytes = 32 bits
2^32 = 4,294,967,296

El problema viene con el almacenamiento.

Para almacenar un carácter simple “A” utilizando la codificación ASCII (codificación de 1 byte), necesitamos 8 bits de memoria, es decir, “01000001”. Si queremos almacenar este blog usando ASCII hasta este punto, necesitaríamos aproximadamente 30620 bits, es decir 3.827 bytes.

Para almacenar un carácter simple “A” utilizando una codificación de 4 bytes, necesitamos 32 bits de memoria, es decir, “00000000 00000000 00000000 01000001”. Si queremos almacenar este blog usando una codificación de 4 bytes hasta este punto, necesitaríamos aproximadamente 161,666 bits, es decir 16.166 bytes.

Ese es 4 veces el tamaño requerido para ASCII. Es por eso que necesitamos una forma eficiente de codificar estos puntos Unicode sin desperdiciar memoria.

UTF-8 y UTF-16

Hay varias formas de codificar puntos de código Unicode en bits. UTF-32 es una de esas formas que almacena cada punto de código usando 4 bytes y acabamos de leer por qué no es una forma eficiente de almacenar estos caracteres. UTF-8 y UTF-16 son otras dos maneras.

Pero UTF-8 y UTF-16 son especiales ya que son codificaciones de longitud variable. Si un punto de código se puede almacenar usando un solo byte, lo almacenará usando un solo byte y si un punto de código requiere 2 bytes, lo codificará usando 2 bytes.

UTF-8 y UTF-16 usan algo llamado bits de señal para determinar si un punto de código está codificado usando más de
un byte El último bit (8.º bit) de un byte se usa como señal para determinar si está usando otro byte para codificar el mismo carácter.

Esa es una forma eficiente de codificar si solo consideramos el tamaño de almacenamiento. Pero leer y procesar bits de señal con demasiada frecuencia puede afectar el rendimiento si los datos son grandes. Esa es una discusión para otro día.

Veamos algunas de las diferencias entre UTF-8 y UTF-16.

CodificaciónNº mínimo de bytesNº máximo de bytesNúmero de bytes disponibles para usar
UTF-8141,2,3 y 4
UTF-16242 y 4
UTF-32444

Los puntos de código Unicode se escriben en hexadecimal precedidos por un “T+” por ejemplo A se escribe como “U+0041” cual es la forma hexadecimal de escribir sesenta y cinco.

Los primeros 128 caracteres en UTF-8 son exactamente los mismos caracteres que están en el juego de caracteres ASCII. Incluso su representación de bits es exactamente la misma, lo que brinda compatibilidad con versiones anteriores de UTF-8 con ASCII.

Referencias

Similar Posts

Leave a Reply

Your email address will not be published.