¿Cuáles son las diferencias entre ANSI; Unicode; Unicode big endian;
1. Código ASCII
Sabemos que dentro del ordenador, toda la información se representa en última instancia como una cadena binaria. Cada bit binario (bit) tiene dos estados: 0 y 1, por lo que ocho bits binarios se pueden combinar en 256 estados, lo que se denomina byte. En otras palabras, se puede usar un byte para representar 256 estados diferentes. Cada estado corresponde a un símbolo, que son 256 símbolos, desde 0000000 hasta 11111111. ?
En la década de 1960, Estados Unidos formuló un conjunto de codificaciones de caracteres que unificaban la relación entre los caracteres ingleses y los bits binarios. Esto se llamó ASCII y todavía se utiliza hoy en día. ?
El código ASCII 1*** especifica la codificación de 128 caracteres. Por ejemplo, el espacio "ESPACIO" es 32 (00100000 binario) y la letra mayúscula A es 65 (01000001 binario). Estos 128 símbolos (incluidos 32 símbolos de control que no se pueden imprimir) solo ocupan los últimos 7 bits de un byte y el primer bit se establece uniformemente en 0.
2. Codificación no ASCII
128 símbolos son suficientes para codificar inglés, pero 128 símbolos no son suficientes para representar otros idiomas. Por ejemplo, en francés, si hay símbolos fonéticos encima de las letras, no se pueden representar mediante el código ASCII. Como resultado, algunos países europeos decidieron utilizar los bits más altos inactivos de los bytes para codificar nuevos símbolos. Por ejemplo, la codificación de é en francés es 130 (binario 10000010). Como resultado, el sistema de codificación utilizado en estos países europeos puede representar hasta 256 símbolos. ?
Sin embargo, aquí surge un nuevo problema. Cada país tiene diferentes alfabetos, por lo que incluso si todos usan una codificación de 256 símbolos, las letras que representan son diferentes. Por ejemplo, 130 representa é en codificación francesa, representa la letra Gimel (?) en codificación hebrea y representa otro símbolo en codificación rusa. Pero pase lo que pase, en todos estos métodos de codificación, los símbolos representados por 0-127 son los mismos, la única diferencia es la sección 128-255. ?
En cuanto a los caracteres de los países asiáticos, utilizan aún más símbolos, con hasta 100.000 caracteres chinos. Un byte solo puede representar 256 símbolos, lo que definitivamente no es suficiente. Se deben usar varios bytes para expresar un símbolo. Por ejemplo, el método de codificación común para el chino simplificado es GB2312, que utiliza dos bytes para representar un carácter chino, por lo que en teoría puede representar hasta 256x256=65536 símbolos. ?
El tema de la codificación china requiere un artículo especial para ser discutido y esta nota no lo cubre. Aquí solo se señala que, aunque se utilizan varios bytes para representar un símbolo, la codificación de caracteres chinos de la clase GB no tiene nada que ver con Unicode y UTF-8 que se describen más adelante.
3.Unicode
Como se mencionó en la sección anterior, existen muchos métodos de codificación en el mundo y el mismo número binario se puede interpretar en diferentes símbolos. Por lo tanto, si desea abrir un archivo de texto, debe conocer su método de codificación; de lo contrario, si utiliza el método de codificación incorrecto para interpretarlo, aparecerán caracteres confusos. ¿Por qué los correos electrónicos suelen ser confusos? Esto se debe a que el remitente y el destinatario utilizan diferentes métodos de codificación. ?
Es concebible que si existe un código que incluya todos los símbolos del mundo. A cada símbolo se le asigna un código único, por lo que el problema de los caracteres confusos desaparecerá. Esto es Unicode, como su nombre indica, una codificación de todos los símbolos. ?
Unicode es, por supuesto, una colección muy grande, capaz actualmente de contener más de 1 millón de símbolos. La codificación de cada símbolo es diferente. Por ejemplo, U 0639 representa la letra árabe Ain, U 0041 representa la letra mayúscula inglesa A y U 4E25 representa el carácter chino "estricto".
Para obtener una tabla de correspondencia de símbolos específica, puede consultar unicode.org o una tabla de correspondencia de caracteres chinos especializada.
4. Problemas con Unicode
Cabe señalar que Unicode es solo un conjunto de símbolos. Solo especifica el código binario del símbolo, pero no especifica cómo debe ser este código binario. ser almacenado. ?
Por ejemplo, el unicode del carácter chino "estricto" es el número hexadecimal 4E25, el cual se convierte en un número binario de 15 dígitos (100111000100101), lo que significa que la representación de este símbolo requiere al menos menos 2 bytes. Representar otros símbolos más grandes puede requerir 3 bytes o 4 bytes, o incluso más. ?
Hay dos problemas serios aquí. La primera pregunta es, ¿cómo distinguir Unicode y ASCII? ¿Cómo sabe la computadora que tres bytes representan un símbolo, en lugar de tres símbolos separados? El segundo problema es que ya sabemos que solo un byte es suficiente para representar letras en inglés. Si Unicode estipula uniformemente que cada símbolo está representado por tres o cuatro bytes, entonces cada letra en inglés debe estar precedida por dos caracteres. lo cual es un gran desperdicio de almacenamiento y el tamaño del archivo de texto será dos o tres veces mayor, lo cual es inaceptable. ?
Sus resultados son: 1) Han surgido múltiples métodos de almacenamiento de Unicode, lo que significa que hay muchos formatos binarios diferentes que se pueden usar para representar Unicode. 2) Unicode no pudo promocionarse durante mucho tiempo hasta la aparición de Internet.
5.UTF-8
La popularidad de Internet requiere fuertemente la aparición de un método de codificación unificado. UTF-8 es la implementación Unicode más utilizada en Internet. Otras implementaciones incluyen UTF-16 (los caracteres están representados por dos bytes o cuatro bytes) y UTF-32 (los caracteres están representados por cuatro bytes), pero básicamente no se utilizan en Internet. Nuevamente, la relación aquí es que UTF-8 es una de las implementaciones de Unicode. ?
Una de las características más importantes de UTF-8 es que es un método de codificación de longitud variable. Puede utilizar de 1 a 4 bytes para representar un símbolo y la longitud del byte varía según los diferentes símbolos. ?
Las reglas de codificación de UTF-8 son muy simples, solo hay dos: ?
1) Para símbolos de un solo byte, el primer bit del byte se establece en 0 , seguido de 7 bits. El código Unicode para este símbolo. Entonces, para las letras en inglés, la codificación UTF-8 y el código ASCII son los mismos. ?
2) Para un símbolo de n bytes (ngt; 1), los primeros n bits del primer byte se establecen en 1, el enésimo bit se establece en 0 y los dos primeros bits de los siguientes bytes se establecen en 0. Los bits siempre se establecen en 10. Los bits binarios restantes que no se mencionan son todos el código Unicode de este símbolo. ?
La siguiente tabla resume las reglas de codificación. La letra x indica los bits de codificación disponibles. ?
¿Rango de símbolos Unicode | Método de codificación UTF-8?
(Hexadecimal) | (Binario)?
——————– ——— —————————————?
0000 0000-0000 007F | p>0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx?
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx?
Según la tabla anterior, interpretar la codificación UTF-8 es muy difícil. Si el primer bit de un byte es 0, entonces el byte por sí solo es un carácter; si el primer bit es 1, el número de unos consecutivos indica cuántos bytes ocupa el carácter actual.
?
A continuación, tomemos el carácter chino "estricto" como ejemplo para demostrar cómo implementar la codificación UTF-8. ?
Se sabe que el Unicode de "estricto" es 4E25 (100111000100101). Según la tabla anterior, se puede encontrar que 4E25 está en el rango de la tercera línea (0000 0800-0000 FFFF). ), por lo que el UTF de codificación "estricta" -8 requiere tres bytes, es decir, el formato es "1110xxxx 10xxxxxx 10xxxxxx". Luego, comenzando desde el último dígito binario de "estricto", complete la x en el formato de atrás hacia adelante y complete los bits adicionales con 0. De esta forma conseguimos que la codificación UTF-8 de “Yan” es “11100100 10111000 10100101”, que al convertirlo a hexadecimal es E4B8A5.
6. Conversión entre Unicode y UTF-8
A través del ejemplo del apartado anterior, puedes ver que el código Unicode de "estricto" es 4E25 y la codificación UTF-8. es E4B8A5, los dos son diferentes. La conversión entre ellos se puede lograr mediante programas. ?
En la plataforma Windows, uno de los métodos de conversión más simples es utilizar el subprograma integrado Notepad.exe. Después de abrir el archivo, haga clic en el comando "Guardar como" en el menú "Archivo" y aparecerá un cuadro de diálogo con una barra desplegable "Codificación" en la parte inferior. ?
Hay cuatro opciones: ANSI, Unicode, Unicode big endian y UTF-8.
1) ANSI es el método de codificación predeterminado. Para archivos en inglés, es la codificación ASCII y para archivos en chino simplificado, es la codificación GB2312 (solo para la versión en chino simplificado de Windows, si es la versión en chino tradicional, se utilizará el código Big5).
2) La codificación Unicode se refiere al método de codificación UCS-2, que utiliza directamente dos bytes para almacenar el código Unicode del carácter. Esta opción utiliza el formato little endian.
3) La codificación Unicode big endian corresponde a la opción anterior. Explicaré el significado de little endian y big endian en la siguiente sección.
4) Codificación UTF-8, que es el método de codificación mencionado en el apartado anterior. ?
Después de seleccionar el "método de codificación", haga clic en el botón "Guardar" y el método de codificación del archivo se convertirá inmediatamente.
7. Little endian y Big endian
Como se mencionó en la sección anterior, los códigos Unicode se pueden almacenar directamente en formato UCS-2. Tomando el carácter chino "estricto" como ejemplo, el código Unicode es 4E25 y debe almacenarse en dos bytes, un byte es 4E y el otro byte es 25. Al almacenar, 4E está al frente y 25 detrás, que es el método Big Endian. 25 está al frente y 4E está detrás, que es el método Little Endian.
Estos dos extraños nombres provienen de "Los viajes de Gulliver" del escritor británico Swift. En el libro, estalló una guerra civil en Lilliput. La causa de la guerra fue la disputa de la gente sobre si romper huevos del Big-Endian o del Little-Endian. Debido a este incidente, estallaron seis guerras, un emperador perdió la vida y otro emperador perdió su trono. ?
Por lo tanto, si el primer byte va primero, es "Big endian", y si el segundo byte va primero, es "Little endian".
?
Así que, naturalmente, surgirá una pregunta: ¿Cómo sabe la computadora en qué forma está codificado un determinado archivo?
Está definido en la especificación Unicode que se agrega un carácter que indica la secuencia de codificación al frente de cada archivo. El nombre de este carácter se llama "ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO", usando FEFF express. Son exactamente dos bytes y FF es uno mayor que FE. ?
Si los primeros dos bytes de un archivo de texto son FE FF, significa que el archivo usa el modo de extremo grande; si los primeros dos bytes son FF FE, significa que el archivo usa el modo de extremo pequeño; modo.
8. Ejemplo
El siguiente es un ejemplo. ?
Abra el programa "Bloc de notas" Notepad.exe, cree un nuevo archivo de texto, el contenido es la palabra "estricto" y guárdelo en codificación ANSI, Unicode, Unicode big endian y UTF-8. ?
Luego, utilice la "función hexadecimal" en el software de edición de texto UltraEdit para observar la codificación interna del archivo. ?
1) ANSI: La codificación del archivo es de dos bytes "D1 CF", que es la codificación "estricta" GB2312, lo que también implica que GB2312 se almacena en el formato de cabeza grande. ?
2) Unicode: La codificación es de cuatro bytes "FF FE 25 4E", donde "FF FE" indica que está almacenado en modo little endian, y la codificación real es 4E25. ?
3) Unicode big endian: la codificación es de cuatro bytes "FE FF 4E 25", donde "FE FF" indica almacenamiento big endian. ?
4) UTF-8: La codificación es de seis bytes "EF BB BF E4 B8 A5". Los primeros tres bytes "EF BB BF" indican que se trata de codificación UTF-8 y los últimos tres. bytes "E4B8A5" es la codificación específica de "Yan" y su orden de almacenamiento es coherente con el orden de codificación.