Comprender la codificación de caracteres

¿Alguna vez imaginaste cómo una computadora es capaz de entender y mostrar lo que has escrito? ¿Alguna vez se preguntó qué significaba UTF-8 o UTF-16 cuando estaba pasando por algunas configuraciones? Solo piense en cómo una computadora debería interpretar «HeLLo WorlD».
Todos sabemos que una computadora almacena datos en bits y bytes. Entonces, para mostrar un carácter en la pantalla o mapear el carácter como un byte en la memoria de la computadora necesita tener un estándar. Lea lo siguiente :

\x48\x65\x4C\x4C\x6F\x20\x57\x6F\x72\x6C\x44

Esto es algo que un recuerdo te mostraría. ¿Cómo sabe qué carácter especifica cada byte de memoria?

Aquí viene la codificación de caracteres en la imagen:

Si aún no lo ha adivinado, es «HeLLo WorlD» en UTF-8 para usted. Y sí, seguiremos adelante y leeremos sobre UTF-8. Pero empecemos con ASCII. La mayoría de ustedes que han hecho programación o trabajado con strings deben haber sabido qué es ASCII. Si no lo ha hecho, definamos qué es ASCII.
ASCII: ASCII significa Código Estándar Estadounidense para el Intercambio de Información. Las computadoras solo pueden entender números, por lo que un código ASCII es la representación numérica de un carácter como ‘a’ o ‘@’ o una acción de algún tipo. ASCII se desarrolló hace mucho tiempo y ahora los caracteres que no se imprimen rara vez se usan para su propósito original.

Solo mira lo siguiente –

hexadecimal Decimal Personaje
\x48 110 H
\x65 145 mi
\x4c 114 L

Y así. Puede ver la tabla ASCII y el mapeo en http://www.asciitable.com/ . Si aún no has mirado la tabla, ¡te recomiendo que lo hagas ahora! Observará que se trata de un conjunto simple de palabras y signos de puntuación en inglés.

Ahora supongamos que quiero escribir los siguientes caracteres: 

¿ A
B?@

Mi decodificador interpretará esto como 0x410x0a0x200x420x3f0x40 en hexadecimal y 065010032066063064 en decimal, donde incluso un espacio (0x20) y una línea siguiente (0x0a) tienen un valor de byte o un espacio de memoria.

Distintos países, idiomas pero la necesidad que los unió 

Hoy internet ha hecho que el mundo se acerque. Y la gente de todo el mundo no solo habla inglés, ¿verdad? Surgió la necesidad de ampliar este espacio. Si ha creado una aplicación y ve que la gente en Francia quiere usarla, entonces ve un gran potencial allí. ¿No sería bueno simplemente tener un cambio en el idioma pero tener la misma funcionalidad?

¿Por qué no crear un Código Universal en abreviatura Unicode para todos?

Entonces, aquí vino Unicode con una muy buena idea. Asignó a cada carácter, incluidos los diferentes idiomas, un número único llamado Code Point. Una ventaja de Unicode sobre otros conjuntos posibles es que sus primeros 256 puntos de código son idénticos a ASCII. Entonces, para un software/navegador, es más fácil codificar y decodificar caracteres de la mayoría de los idiomas vivos que se usan en las computadoras. Pretende ser, y en gran medida ya lo es, un superconjunto de todos los demás conjuntos de caracteres que se han codificado.

Unicode también es un conjunto de caracteres (no una codificación). Utiliza los mismos caracteres que el estándar ASCII, pero amplía la lista con caracteres adicionales, lo que otorga a cada carácter un punto de código. Tiene la ambición de contener todos los personajes (e íconos populares) usados ​​en todo el mundo.

Antes de saber esto, aclaremos algunas terminologías  :

  • Un carácter es una unidad mínima de texto que tiene valor semántico.
  • Un conjunto de caracteres es una colección de caracteres que pueden ser utilizados por varios idiomas. Ejemplo: el conjunto de caracteres latinos se usa en inglés y en la mayoría de los idiomas europeos, aunque el conjunto de caracteres griegos solo se usa en el idioma griego.
  • Un conjunto de caracteres codificados es un conjunto de caracteres en el que cada carácter corresponde a un número único.
  • Un punto de código de un juego de caracteres codificado es cualquier valor legal en el juego de caracteres.
  • Una unidad de código es una secuencia de bits utilizada para codificar cada carácter de un repertorio dentro de una forma de codificación dada.

¿Alguna vez se preguntó qué es UTF-8 o UTF-16?

UTF-8:  UTF-8 ha sido realmente la codificación de caracteres dominante para la World Wide Web desde 2009 y, en junio de 2017, representa el 89,4 % de todas las páginas web. UTF-8 codifica cada uno de los 1 112 064 puntos de código válidos en Unicode utilizando de uno a cuatro bytes de 8 bits. Los puntos de código con valores numéricos más bajos, que tienden a ocurrir con mayor frecuencia, se codifican con menos bytes. Los primeros 128 caracteres de Unicode, que corresponden uno a uno con ASCII, se codifican utilizando un solo octeto con el mismo valor binario que ASCII, de modo que el texto ASCII válido también es Unicode codificado en UTF-8 válido.

Entonces, ¿cuántos bytes dan acceso a qué caracteres en estas codificaciones?
UTF-8:
1 byte: ASCII estándar
2 bytes: árabe, hebreo, la mayoría de las secuencias de comandos europeas (sobre todo excluyendo el georgiano)
3 bytes: BMP
4 bytes: todos los caracteres Unicode

UTF-16:
2 bytes: BMP
4 bytes: todos los caracteres Unicode

Así que hice una mención sobre BMP. ¿Qué es exactamente?

Basic Multilingual Plane (BMP) contiene caracteres para casi todos los idiomas modernos y una gran cantidad de símbolos. Un objetivo principal para el BMP es apoyar la unificación de conjuntos de caracteres anteriores, así como caracteres para escritura.

UTF-8, UTF-16 y UTF-32 son codificaciones que aplican la tabla de caracteres Unicode. Pero cada uno tiene una forma ligeramente diferente de cómo codificarlos. UTF-8 solo usará 1 byte al codificar un carácter ASCII, dando el mismo resultado que cualquier otra codificación ASCII. Pero para otros caracteres, usará el primer bit para indicar que seguirá un segundo byte. UTF-16 usa 16 bits de forma predeterminada, pero eso solo le brinda 65k caracteres posibles, que no es lo suficientemente cerca para el conjunto completo de Unicode. Entonces, algunos caracteres usan pares de valores de 16 bits. UTF-32 es lo opuesto, usa la mayor cantidad de memoria (cada carácter tiene un ancho fijo de 4 bytes), lo que lo hace bastante inflado, pero ahora en este escenario, cada carácter tiene esta longitud precisa, por lo que la manipulación de strings se vuelve mucho más simple. Puede calcular el número de caracteres en una string simplemente a partir de la longitud en bytes de la string.

Como este es solo el comienzo en el mundo de la codificación de caracteres. Espero que esto te ayude a comprender la codificación de caracteres a un nivel superior.

Este artículo es una contribución de Deepa Banerjee . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *