Si está escribiendo una aplicación internacional que usa varios idiomas, entonces necesita saber un par de cosas sobre la codificación. Ella es responsable de cómo se muestra el texto en la pantalla. Hablaré brevemente sobre la historia de la codificación y su estandarización, y luego hablaremos sobre su uso. Toquemos un poco la teoría de la informática.
Introducción a la codificación
Las computadoras solo entienden números binarios: ceros y unos, este es su idioma. Nada más. Un número se llama byte, cada byte se compone de ocho bits. Es decir, ocho ceros y unos forman un byte. Dentro de las computadoras, todo se reduce a binarios: lenguajes de programación, movimientos del mouse, pulsaciones de teclas y todas las palabras en la pantalla. Pero si el artículo que estás leyendo solía ser un montón de ceros y unos, ¿cómo se convirtieron los números binarios en texto? Vamos a resolverlo.
Una breve historia de la codificación
En los albores de su desarrollo, Internet era exclusivamente de habla inglesa. Sus autores y usuarios no tenían que preocuparse por los caracteres de otros idiomas, y todas las necesidades estaban completamente cubiertas por la codificación del Código Estándar Americano para el Intercambio de Información (ASCII).
ASCII es una tabla para asignar símbolos binarios a caracteres alfabéticos. Cuando la computadora recibe una entrada como esta:
01001000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
luego, usando ASCII, lo convierte a la frase "Hola mundo".
Un byte (ocho bits) era lo suficientemente grande como para contener cualquier letra en inglés, así como caracteres de control, algunos de los cuales eran utilizados por teletipo, por lo que en aquellos años eran útiles (hoy ya no son muy útiles). Los caracteres de control fueron, por ejemplo, 7 (0111 en binario), lo que provocó que la computadora emitiera una señal; 8 (1000 en binario): muestra el último carácter impreso; o 12 (1100 en binario) - borró todo el texto escrito en el terminal de video.
En aquellos días, las computadoras contaban 8 bits por byte (este no siempre fue el caso), por lo que no hubo ningún problema. Podríamos almacenar todos los caracteres de control, todos los números y letras en inglés, e incluso quedaba espacio, ya que un byte puede codificar 255 caracteres, y ASCII solo necesita 127. Es decir, todavía quedaban 128 posiciones en la codificación sin usar.
Así es como se ve una tabla ASCII. Los números binarios codifican todas las letras mayúsculas y minúsculas de la A a la Z y los números del 0 al 9. Las primeras 32 posiciones están reservadas para caracteres de control no imprimibles.
Problemas ASCII
Las posiciones 128 a 255 estaban vacías. El público se preguntó cómo llenarlos. Pero todos tenían ideas diferentes . El American National Standards Institute (ANSI) formula estándares para diferentes industrias. Aprobaron las posiciones ASCII de 0 a 127. Nadie las cuestionó. El problema estaba en el resto de puestos.
Esto es lo que llenó los puestos 128-255 en las primeras computadoras IBM:
Algunos garabatos, iconos de fondo, operadores matemáticos y símbolos acentuados como é. Pero los desarrolladores de otras arquitecturas informáticas no apoyaron la iniciativa. Todos querían implementar su propia codificación en la segunda mitad de ASCII.
Todas estas diferentes terminaciones se han denominado páginas de códigos .
¿Qué son las páginas de códigos ASCII?
¡Aquí hay una colección de más de 465 páginas de códigos diferentes! Había diferentes páginas incluso dentro del mismo idioma, por ejemplo, para griego y chino. ¿Cómo se podría estandarizar este lío? ¿O al menos hacerlo funcionar entre diferentes idiomas? ¿O entre diferentes páginas de códigos para el mismo idioma? ¿En otros idiomas además del inglés? Los chinos tienen más de 100.000 caracteres. ASCII ni siquiera puede acomodarlos a todos, incluso si decidieron dar todas las posiciones vacías para los caracteres chinos.
Este problema incluso se llamó Mojibake (bnop, krakozyabry). Esto es lo que dicen sobre el texto distorsionado, que se obtiene al utilizar una codificación incorrecta. Traducido del japonés, mojibake significa "conversión de caracteres".
Un ejemplo de bnopni (krakozyabrov).
Una especie de locura ...
¡Exactamente! No hubo posibilidad de convertir los datos de manera confiable. Internet es solo una monstruosa conexión de computadoras en todo el mundo. Imagínese que todos los países deciden utilizar sus propios estándares. Por ejemplo, las computadoras griegas solo aceptan griego, mientras que las computadoras inglesas solo envían inglés. Es como gritar en una cueva vacía, nadie puede oírte.
ASCII ya no era adecuado para la vida. Para Internet en todo el mundo, se tuvo que crear algo diferente, o habría habido cientos de páginas de códigos con las que lidiar. A menos que usted no quiere a leer estos párrafos.
֎֏ 0590 ׀ׁׂ׃ׅׄ׆ׇ
Así nació Unicode
Unicode son las siglas de Universal Coded Character Set (UCS) y tiene la designación oficial ISO / IEC 10646. Pero generalmente todos usan el nombre Unicode.
Este estándar ayudó a resolver los problemas causados por la codificación y las páginas de códigos. Contiene muchos puntos de código ( puntos de código) asignados a caracteres de idiomas y culturas de todo el mundo. Es decir, Unicode es un conjunto de caracteres . Puede usarse para asociar alguna abstracción con la letra a la que queremos referirnos. Y esto se hace para todos los símbolos, incluso los jeroglíficos egipcios .
Alguien ha hecho un gran trabajo haciendo coincidir cada carácter en todos los idiomas con códigos únicos. Así es como se ve:
«Hello World» U+0048 : H U+0065 : E U+006C : L U+006C : L U+006F : O U+0020 : U+0057 : W U+006F : O U+0072 : R U+006C : L U+0064 : D
El prefijo U + indica que se trata de un estándar Unicode y el número es una conversión binaria. El estándar usa notación hexadecimal, que es una representación simplificada de números binarios. Aquí puede ingresar cualquier cosa en el campo y ver cómo se convierte a Unicode. Y aquí puede admirar los 143.859 puntos de código.
Aclaro por si acaso: estamos hablando de un gran diccionario de puntos de código asignados a todo tipo de símbolos. Este es un conjunto de símbolos muy grande, nada más.
Queda por añadir el último ingrediente.
Unicode Transform Protocol (UTF)
UTF es un protocolo para codificar puntos de código en Unicode. Está detallado en el estándar y le permite codificar cualquier punto de código. Sin embargo, existen diferentes tipos de UTF. Se diferencian en el número de bytes que se utilizan para codificar un elemento. UTF-8 usa un byte por punto, UTF-16 usa dos bytes y UTF-32 usa cuatro bytes.
Pero si tenemos tres codificaciones diferentes, ¿cómo sabemos cuál se usa en un archivo en particular? Para ello, se utiliza una marca de orden de bytes (BOM), que también se denomina Firma de codificación. BOM es un marcador de dos bytes al principio del archivo que le indica qué codificación se utiliza aquí.
En Internet, UTF-8 es el más utilizado , también está escrito como preferido en el estándar HTML5, así que le prestaré la mayor atención.
Este gráfico fue construido en 2012, UTF-8 se estaba convirtiendo en la codificación dominante. Y todavía lo es.
El gráfico muestra la prevalencia de UTF-8.
¿Qué es UTF-8 y cómo funciona?
UTF-8 codifica en un byte cada punto de código Unicode 0 a 127 (como en ASCII). Es decir, si escribió su programa usando ASCII y sus usuarios usan UTF-8, no notarán nada fuera de lo común. Todo funcionará según lo previsto. Tenga en cuenta lo importante que es esto. Necesitábamos mantener la compatibilidad con versiones anteriores de ASCII durante la adopción masiva de UTF-8. Y esta codificación no rompe nada.
Como sugiere el nombre, un punto de código consta de 8 bits (un byte). Hay caracteres en Unicode que ocupan varios bytes (hasta 6). A esto se le llama longitud variable. En diferentes idiomas, el número específico de bytes es diferente. En inglés - 1, idiomas europeos (con alfabeto latino), hebreo y áraberepresentado por dos bytes por punto de código. Para chino, japonés, coreano y otros idiomas asiáticos , se utilizan tres bytes.
Si necesita que un carácter ocupe más de un byte, entonces se utiliza un patrón de bits para indicar la transición; significa que el carácter continúa en los siguientes bytes.
Y ahora, como por arte de magia, llegamos a un acuerdo sobre cómo codificar el cuneiforme sumerio (Habr no lo muestra), ¡así como los iconos emoji !
Para resumir, primero leemos la lista de materiales para determinar la versión de codificación, luego convertimos el archivo a puntos de código Unicode y luego mostramos los caracteres del conjunto Unicode.
Finalmente sobre UTF
Los códigos son claves . Si publico la codificación incorrecta, no podrás leer nada. Tenga esto en cuenta al enviar y recibir datos. En nuestras herramientas del día a día, esto a menudo se abstrae, pero para nosotros, los programadores, es importante comprender lo que está sucediendo debajo del capó.
¿Cómo configuramos la codificación? Dado que HTML está escrito en inglés y casi todas las codificaciones funcionan bien con el inglés, podemos especificar la codificación al principio de la sección
<had>
.
<html lang="en">
<head>
<meta charset="utf-8">
</head>
Es importante hacer esto desde el principio
<had>
, ya que el análisis de HTML puede comenzar de nuevo si se está utilizando la codificación incorrecta. También puede averiguar la versión de codificación en el encabezado Content-Type de la solicitud / respuesta HTTP.
Si el documento HTML no contiene ninguna mención a la codificación, la especificación HTML5 ofrece una solución interesante como el rastreo de BOM . Con su ayuda, podemos determinar la codificación utilizada por el marcador de orden de bytes (BOM).
Es todo?
Unicode aún no está completo. Como ocurre con cualquier estándar, agregamos algo, eliminamos algo, ofrecemos algo nuevo. Ninguna de las especificaciones está "completa". Por lo general, hay 1-2 lanzamientos al año, puede encontrar su descripción aquí .
Recientemente leí acerca de un error muy interesante relacionado con la visualización incorrecta de caracteres Unicode rusos en Twitter .
Si has leído hasta el final, eres genial. Te sugiero que hagas tu tarea. Vea cómo los sitios pueden romperse cuando usan la codificación incorrecta. Me aproveché de estoextensión para Google Chrome, cambió la codificación e intentó abrir diferentes páginas. La información era completamente ilegible. Pruébelo usted mismo, qué aspecto tiene un muñón. Esto le ayudará a comprender la importancia de la codificación.
Conclusión
Mientras escribía este artículo, conocí a Michael Everson . Desde 1993, ha propuesto más de 200 cambios a Unicode, agregando miles de caracteres al estándar. A partir de 2003, fue considerado el miembro más productivo. Solo él influyó en gran medida en el rostro de Unicode. Michael es uno de los que hicieron Internet como lo conocemos hoy. Muy impresionante.
Espero poder mostrarte para qué sirven las codificaciones, qué problemas resuelven y qué sucede cuando fallan.