JavaRush /Blog Java /Random-ES /Codificación de texto ASCII (Windows 1251, CP866, KOI8-R)...
articles
Nivel 15

Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers

Publicado en el grupo Random-ES
Hoy hablaremos sobre el origen de los krakozyabrs en un sitio web y en los programas, qué codificaciones de texto existen y cuáles deberían usarse. Echemos un vistazo más de cerca a la historia de su desarrollo, comenzando con ASCII básico, así como sus versiones extendidas CP866, KOI8-R, Windows 1251 y terminando con las codificaciones modernas del consorcio Unicode UTF 16 y 8. Índice Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 1: Para algunos, esta información puede parecer innecesaria, pero ¿saben cuántas preguntas recibo específicamente sobre los krakozyabrs (conjunto de caracteres ilegibles) que se arrastran? Ahora tendré la oportunidad de remitir a todos al texto de este artículo y encontrar mis propios errores. Bueno, prepárate para absorber la información e intenta seguir el flujo de la historia.

ASCII: codificación de texto básica para el alfabeto latino

El desarrollo de las codificaciones de texto se produjo simultáneamente con la formación de la industria de TI, y durante este tiempo lograron sufrir muchos cambios. Históricamente, todo comenzó con EBCDIC, que era bastante disonante en la pronunciación rusa, lo que permitía codificar letras del alfabeto latino, números arábigos y signos de puntuación con caracteres de control. Pero aún así, el punto de partida para el desarrollo de codificaciones de texto modernas debe considerarse el famoso ASCII (Código estándar estadounidense para el intercambio de información, que en ruso se suele pronunciar como "preguntar"). Describe los primeros 128 caracteres más utilizados por los usuarios de habla inglesa: letras latinas, números arábigos y signos de puntuación. Estos 128 caracteres descritos en ASCII también incluían algunos caracteres de servicio como corchetes, marcas de almohadilla, asteriscos, etc. De hecho, puedes verlos tú mismo: Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 2son estos 128 caracteres de la versión original de ASCII los que se convirtieron en el estándar, y en cualquier otra codificación seguramente los encontrarás y aparecerán en este orden. Pero el hecho es que con la ayuda de un byte de información puedes codificar no 128, sino hasta 256 valores diferentes (dos elevado a ocho es igual a 256), por lo tanto, después de la versión básica de Asuka, todo un Aparecieron una serie de codificaciones ASCII extendidas , en las que era posible, además de los 128 caracteres básicos, también codificarse utilizando caracteres de codificación nacional (por ejemplo, ruso). Aquí probablemente valga la pena decir un poco más sobre los sistemas numéricos que se utilizan en la descripción. En primer lugar, como todos sabéis, un ordenador sólo funciona con números del sistema binario, es decir, ceros y unos (“álgebra booleana”, si alguien la estudió en un instituto o escuela). Un byte consta de ocho bits, cada uno de los cuales representa un dos elevado a dos, comenzando desde cero y hasta dos hasta el séptimo: Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 3 no es difícil comprender que todas las combinaciones posibles de ceros y unos en tal construcción pueden sólo será 256. Convertir un número del sistema binario a decimal es bastante sencillo. Sólo necesitas sumar todas las potencias de dos con las que están por encima de ellas. En nuestro ejemplo, esto resulta ser 1 (2 elevado a cero) más 8 (dos elevado a 3), más 32 (dos elevado a la quinta), más 64 (a la sexta potencia), más 128 (a la séptima potencia). El total es 233 en notación decimal. Como puedes ver, todo es muy sencillo. Pero si miras de cerca la tabla con caracteres ASCII, verás que están representados en codificación hexadecimal. Por ejemplo, "asterisco" corresponde al número hexadecimal 2A en Aski. Probablemente sepas que en el sistema numérico hexadecimal, además de los números arábigos, también se utilizan letras latinas desde la A (significa diez) hasta la F (significa quince). Bueno, para convertir un número binario a hexadecimal.recurra al siguiente método sencillo. Cada byte de información se divide en dos partes de cuatro bits. Aquellos. En cada medio byte, sólo se pueden codificar dieciséis valores (dos a la cuarta potencia) en binario, lo que se puede representar fácilmente como un número hexadecimal. Además, en la mitad izquierda del byte, los grados deberán contarse nuevamente comenzando desde cero, y no como se muestra en la captura de pantalla. Como resultado, obtenemos que el número E9 está codificado en la captura de pantalla. Espero que el curso de mi razonamiento y la solución a este enigma te hayan quedado claros. Bueno, ahora sigamos, de hecho, hablando de codificaciones de texto.

Versiones extendidas de Asuka: codificaciones CP866 y KOI8-R con pseudografía

Entonces, comenzamos a hablar de ASCII, que fue, por así decirlo, el punto de partida para el desarrollo de todas las codificaciones modernas (Windows 1251, Unicode, UTF 8). Inicialmente, contenía solo 128 caracteres del alfabeto latino, números arábigos y algo más, pero en la versión extendida fue posible utilizar los 256 valores que se pueden codificar en un byte de información. Aquellos. Se hizo posible agregar símbolos de letras de su idioma a Aski. Aquí tendremos que hacer una digresión una vez más para explicar por qué son necesarias las codificaciones de texto y por qué son tan importantes. Los caracteres en la pantalla de su computadora se forman sobre la base de dos cosas: conjuntos de formas vectoriales (representaciones) de varios caracteres (están en archivos con fuentes que están instaladas en su computadora) y un código que le permite extraer exactamente ese. de este conjunto de formas vectoriales (archivo de fuente) símbolo que deberá insertarse en el lugar correcto. Está claro que las fuentes mismas son responsables de las formas vectoriales, pero el sistema operativo y los programas utilizados en él son responsables de la codificación. Aquellos. cualquier texto en su computadora será un conjunto de bytes, cada uno de los cuales codifica un solo carácter de este mismo texto. El programa que muestra este texto en la pantalla (editor de texto, navegador, etc.), al analizar el código, lee la codificación del siguiente carácter y busca la forma vectorial correspondiente en el archivo de fuente requerido, que está conectado para mostrar este Documento de texto. Todo es simple y banal. Esto significa que para codificar cualquier carácter que necesitemos (por ejemplo, del alfabeto nacional), se deben cumplir dos condiciones: la forma vectorial de este carácter debe estar en la fuente utilizada, y este carácter podría codificarse en codificaciones ASCII extendidas. en un byte. Por lo tanto, existen muchas opciones de este tipo. Sólo para codificar caracteres del idioma ruso, existen varias variedades de Aska extendido. Por ejemplo, apareció originalmente CP866 , que tenía la capacidad de utilizar caracteres del alfabeto ruso, y era una versión extendida de ASCII. Es decir, su parte superior coincidía completamente con la versión básica de Aska (128 caracteres latinos, números y otras tonterías), que se presenta en la captura de pantalla justo arriba, pero la parte inferior de la tabla con codificación CP866 tenía la apariencia indicada en el captura de pantalla justo debajo y permitió codificar otros 128 caracteres (letras rusas y todo tipo de pseudográficos): Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 4 Verá, en la columna de la derecha los números comienzan con 8, porque Los números del 0 al 7 se refieren a la parte básica de ASCII (ver la primera captura de pantalla). Así, la letra cirílica “M” en CP866 tendrá el código 9C (se encuentra en la intersección de la línea correspondiente con 9 y la columna con el número C en el sistema numérico hexadecimal), que se puede escribir en un byte de información. , y si hay una fuente adecuada con caracteres rusos, esta letra aparecerá en el texto sin problemas. ¿De dónde salió esta cantidad?pseudografías en CP866 ? La cuestión es que esta codificación para texto en ruso se desarrolló en aquellos años difíciles en los que los sistemas operativos gráficos no estaban tan extendidos como lo están ahora. Y en Dosa y sistemas operativos de texto similares, los pseudográficos permitieron al menos diversificar de alguna manera el diseño de los textos y, por lo tanto, abundan en él CP866 y todos sus demás pares de la categoría de versiones extendidas de Asuka. CP866 fue distribuido por IBM, pero además, se desarrollaron varias codificaciones para los caracteres del idioma ruso, por ejemplo, KOI8-R se puede atribuir al mismo tipo (ASCII extendido) : Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 5el principio de su funcionamiento sigue siendo el mismo que el del CP866 descrito un poco antes: cada carácter de texto está codificado como un solo byte. La captura de pantalla muestra la segunda mitad de la mesa KOI8-R, porque La primera mitad es completamente consistente con la Asuka básica, que se muestra en la primera captura de pantalla de este artículo. Entre las características de la codificación KOI8-R, se puede observar que las letras cirílicas en su tabla no están en orden alfabético, como se hacía en CP866. Si observa la primera captura de pantalla (de la parte básica, que se incluye en todas las codificaciones extendidas), notará que en KOI8-R las letras rusas se encuentran en las mismas celdas de la tabla que las letras correspondientes del alfabeto latino. de la primera parte de la tabla. Esto se hizo para facilitar el cambio de caracteres rusos a latinos descartando solo un bit (dos elevado a la séptima potencia o 128).

Windows 1251: la versión moderna de ASCII y por qué aparecen las grietas

El mayor desarrollo de las codificaciones de texto se debió al hecho de que los sistemas operativos gráficos estaban ganando popularidad y la necesidad de utilizar pseudográficos en ellos desapareció con el tiempo. Como resultado, surgió todo un grupo que, en esencia, seguían siendo versiones extendidas de Asuka (un carácter de texto está codificado con solo un byte de información), pero sin el uso de símbolos pseudográficos. Pertenecían a las denominadas codificaciones ANSI, desarrolladas por el American Standards Institute. En el lenguaje común, el nombre cirílico también se utilizó para la versión compatible con el idioma ruso. Un ejemplo de esto sería Windows 1251 . Se diferenciaba favorablemente de los CP866 y KOI8-R utilizados anteriormente en que el lugar de los símbolos pseudográficos lo ocupaban los símbolos faltantes de la tipografía rusa (excepto el acento), así como los símbolos utilizados en lenguas eslavas cercanas a Ruso (ucraniano, bielorruso, etc.): Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 6Debido a la abundancia de codificaciones del idioma ruso, los fabricantes de fuentes y de software tenían constantemente dolores de cabeza, y ustedes y yo, queridos lectores, a menudo nos metíamos en problemas con esos mismos errores notorios. cuando hubo confusión con la versión utilizada en el texto. Muy a menudo aparecían al enviar y recibir mensajes por correo electrónico, lo que implicaba la creación de tablas de conversión muy complejas, que, de hecho, no podían resolver este problema fundamentalmente, y a menudo los usuarios utilizaban la transliteración de letras latinas en la correspondencia para evite el famoso galimatías al utilizar codificaciones rusas como CP866, KOI8-R o Windows 1251. De hecho, las grietas que aparecieron en lugar del texto ruso fueron el resultado del uso incorrecto de la codificación de un idioma determinado, que no correspondía al de en el que se codificó originalmente el mensaje de texto. Digamos que si intenta mostrar caracteres codificados con CP866 utilizando la tabla de códigos de Windows 1251, aparecerán estos mismos galimatías (un conjunto de caracteres sin sentido), reemplazando completamente el texto del mensaje. Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 7Una situación similar surge muy a menudo al crear y configurar sitios web, foros o blogs, cuando el texto con caracteres rusos se guarda por error en la codificación incorrecta que se utiliza en el sitio de forma predeterminada, o en el editor de texto incorrecto, lo que añade una mordaza invisible. al código a simple vista. Al final, mucha gente se cansó de esta situación con muchas codificaciones y constantemente asustando basura, y aparecieron los requisitos previos para la creación de una nueva variación universal que reemplazaría a todas las existentes y resolvería el problema de la aparición de textos ilegibles. . Además, estaba el problema de idiomas como el chino, donde había muchos más caracteres del idioma que 256.

Unicode: codificaciones universales UTF 8, 16 y 32

Estos miles de caracteres del grupo lingüístico del Sudeste Asiático no podrían describirse en un solo byte de información que se asignó para codificar caracteres en versiones extendidas de ASCII. Como resultado, se creó un consorcio llamado Unicode (Unicode Consortium) con la cooperación de muchos líderes de la industria de TI (aquellos que producen software, codifican hardware, crean fuentes) que estaban interesados ​​​​en el surgimiento de una codificación de texto universal. La primera variación lanzada bajo los auspicios del Consorcio Unicode fue UTF 32 . El número en el nombre de la codificación significa la cantidad de bits que se utilizan para codificar un carácter. 32 bits equivalen a 4 bytes de información que serán necesarios para codificar un solo carácter en la nueva codificación universal UTF. Como resultado, un mismo archivo con texto codificado en la versión extendida de ASCII y en UTF-32, en este último caso, tendrá un tamaño (peso) cuatro veces mayor. Esto es malo, pero ahora tenemos la oportunidad de codificar usando UTF una cantidad de caracteres igual a dos elevado a treinta segundos ( miles de millones de caracteres que cubrirán cualquier valor realmente necesario con un margen colosal). Pero muchos países con idiomas del grupo europeo no necesitaban usar una cantidad tan grande de caracteres en la codificación, sin embargo, al usar UTF-32, sin ningún motivo recibieron un aumento de cuatro veces en el peso de los documentos de texto. y como resultado, un aumento en el volumen de tráfico de Internet y el volumen de datos almacenados. Esto es mucho y nadie podría permitirse ese desperdicio. Fruto del desarrollo de Unicode apareció UTF-16 , que resultó tener tanto éxito que se adoptó por defecto como espacio base para todos los caracteres que utilizamos. Utiliza dos bytes para codificar un carácter. Veamos cómo se ve esto. En el sistema operativo Windows, puede seguir la ruta “Inicio” - “Programas” - “Accesorios” - “Herramientas del sistema” - “Tabla de caracteres”. Como resultado, se abrirá una tabla con las formas vectoriales de todas las fuentes instaladas en su sistema. Si selecciona el conjunto de caracteres Unicode en las “Opciones avanzadas”, podrá ver para cada fuente por separado toda la gama de caracteres incluidos en ella. Por cierto, al pulsar sobre cualquiera de ellos podrás ver su código de dos bytes en formato UTF-16 , compuesto por cuatro dígitos hexadecimales: Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 8¿Cuántos caracteres se pueden codificar en UTF-16 usando 16 bits? 65.536 (dos elevado a dieciséis), y este es el número que se adoptó como espacio base en Unicode. Además, existen formas de codificar alrededor de dos millones de caracteres usándolo, pero estaban limitadas a un espacio ampliado de un millón de caracteres de texto. Pero incluso esta versión exitosa de la codificación Unicode no trajo mucha satisfacción a quienes escribieron, digamos, programas solo en inglés, porque después de la transición de la versión extendida de ASCII a UTF-16, el peso de los documentos se duplicó (un byte por carácter en Aski y dos bytes para el mismo carácter en YUTF-16). Precisamente para satisfacer a todos y a todos en el consorcio Unicode se decidió crear una codificación de longitud variable . Se llamó UTF-8. A pesar del ocho en el nombre, en realidad tiene una longitud variable, es decir. Cada carácter de texto se puede codificar en una secuencia de uno a seis bytes de longitud. En la práctica, UTF-8 sólo utiliza el rango de uno a cuatro bytes, porque más allá de cuatro bytes de código ya no es posible imaginar nada en teoría. Todos los caracteres latinos que contiene están codificados en un byte, como en el antiguo ASCII. Lo que es digno de mención es que en el caso de codificar solo el alfabeto latino, incluso aquellos programas que no entienden Unicode seguirán leyendo lo que está codificado en YTF-8. Es decir, la parte básica de Asuka simplemente se transfirió a esta creación del consorcio Unicode. Los caracteres cirílicos en UTF-8 están codificados en dos bytes y, por ejemplo, los caracteres georgianos están codificados en tres bytes. El Consorcio Unicode, después de crear UTF 16 y 8, resolvió el problema principal: ahora tenemos un espacio de código único en nuestras fuentes . Y ahora sus fabricantes sólo pueden llenarlo con formas vectoriales de caracteres de texto en función de sus puntos fuertes y capacidades. En la "Tabla de caracteres" de arriba puede ver que diferentes fuentes admiten diferentes números de caracteres. Algunas fuentes ricas en Unicode pueden ser bastante pesadas. Pero ahora se diferencian no en el hecho de que fueron creados para diferentes codificaciones, sino en el hecho de que el fabricante de la fuente ha llenado o no completamente el espacio de código único con ciertas formas vectoriales.

Palabras locas en lugar de letras rusas: cómo solucionarlo

Veamos ahora cómo aparecen krakozyabrs en lugar de texto o, en otras palabras, cómo se selecciona la codificación correcta para el texto en ruso. En realidad, se establece en el programa en el que crea o edita este mismo texto o código utilizando fragmentos de texto. Para editar y crear archivos de texto, personalmente uso un editor HTML y PHP muy bueno, en mi opinión, Notepad++ . Sin embargo, puede resaltar la sintaxis de cientos de otros lenguajes de programación y marcado, y también tiene la capacidad de ampliarse mediante complementos. Lea una reseña detallada de este maravilloso programa en el enlace proporcionado. En el menú superior de Notepad++ hay un elemento "Codificaciones", donde tendrá la oportunidad de convertir una opción existente a la que se utiliza en su sitio de forma predeterminada: Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 9En el caso de un sitio en Joomla 1.5 y superior, como Así como en el caso de un blog en WordPress, debes evitar la apariencia de Krakozyabrov y elegir la opción UTF 8 sin BOM . ¿Qué es el prefijo BOM? El hecho es que cuando estaban desarrollando la codificación YUTF-16, por alguna razón decidieron adjuntarle la capacidad de escribir el código de caracteres tanto en secuencia directa (por ejemplo, 0A15) como a la inversa (150A). . Y para que los programas entendieran en qué secuencia leer los códigos, se inventó la BOM (Byte Order Mark o, en otras palabras, firma), que se expresaba agregando tres bytes adicionales al comienzo de los documentos. En la codificación UTF-8, no se proporcionaron BOM en el consorcio Unicode y, por lo tanto, agregar una firma (esos notorios tres bytes adicionales al comienzo del documento) simplemente evita que algunos programas lean el código. Por tanto, a la hora de guardar archivos en UTF, siempre debemos seleccionar la opción sin BOM (sin firma). De este modo, se protegerá de antemano contra la aparición de krakozyabrs . Lo que es digno de mención es que algunos programas en Windows no pueden hacer esto (no pueden guardar texto en UTF-8 sin una lista de materiales), por ejemplo, el mismo Bloc de notas de Windows. Guarda el documento en UTF-8, pero aún agrega la firma (tres bytes adicionales) al principio. Además, estos bytes siempre serán los mismos: lea el código en secuencia directa. Pero en los servidores, debido a esta pequeña cosa, puede surgir un problema: saldrán delincuentes. Por lo tanto, no utilice el Bloc de notas normal de Windows bajo ninguna circunstancia.para editar documentos en su sitio si no desea que aparezcan grietas. Considero que la mejor y más sencilla opción es el editor Notepad++ ya mencionado, que prácticamente no tiene inconvenientes y sólo tiene ventajas. En Notepad++, cuando selecciona una codificación, tendrá la opción de convertir texto a codificación UCS-2, que es muy similar al estándar Unicode. También en el Bloc de notas será posible codificar texto en ANSI, es decir. En relación al idioma ruso, este será Windows 1251, que ya hemos descrito anteriormente ¿De dónde viene esta información? Está registrado en el registro de su sistema operativo Windows: qué codificación elegir en el caso de ANSI, cuál elegir en el caso de OEM (para el idioma ruso será CP866). Si configura otro idioma predeterminado en su computadora, estas codificaciones serán reemplazadas por otras similares de la categoría ANSI u OEM para ese mismo idioma. Después de guardar el documento en Notepad++ con la codificación que necesita o abrir el documento desde el sitio para editarlo, podrá ver su nombre en la esquina inferior derecha del editor: Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers - 10Para evitar confusiones , además de los pasos descritos anteriormente , Será útil escribir el código fuente en su encabezado de todas las páginas del sitio con información sobre esta misma codificación, para que no haya confusión en el servidor o host local. En general, todos los lenguajes de marcado de hipertexto, excepto HTML, utilizan una declaración xml especial, que especifica la codificación del texto.
<?xml version="1.0" encoding="windows-1251"?>
Antes de analizar el código, el navegador sabe qué versión se está utilizando y exactamente cómo debe interpretar los códigos de caracteres de ese idioma. Pero lo que es digno de mención es que si guarda el documento en el Unicode predeterminado, esta declaración xml se puede omitir (la codificación se considerará UTF-8 si no hay BOM o UTF-16 si hay una BOM). En el caso de un documento HTML, el elemento Meta se utiliza para indicar la codificación , que se coloca entre las etiquetas Head de apertura y cierre:
<head>
...
<meta charset="utf-8">
...
</head>
Esta entrada es bastante diferente del estándar Html 4.01, pero cumple totalmente con el estándar Html 5 y cualquier navegador utilizado actualmente la entenderá correctamente. En teoría, sería mejor colocar el elemento Meta que indica la codificación del documento HTML lo más alto posible en el encabezado del documento , de modo que cuando el texto encuentre el primer carácter que no sea del ANSI básico (que siempre se lee correctamente y en cualquier variación), el navegador ya debería tener información sobre cómo interpretar los códigos de estos caracteres. Enlace a la fuente original: Codificación de texto ASCII (Windows 1251, CP866, KOI8-R) y Unicode (UTF 8, 16, 32): cómo solucionar el problema con los crackers
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION