UTF-8: Unicode TransformationFormat-8bit, se permite BOM, pero generalmente no se incluye BOM. Es una codificación multibyte que se utiliza para resolver caracteres internacionales. Utiliza 8 bits (es decir, un byte) para el inglés y 24 bits (tres bytes) para el chino. UTF-8 contiene caracteres que utilizan todos los países del mundo. Es una codificación internacional y tiene una gran versatilidad. El texto codificado en UTF-8 se puede mostrar en navegadores de varios países que admiten el juego de caracteres UTF8. Por ejemplo, si se trata de codificación UTF8, el chino también se puede mostrar en el IE en inglés de los extranjeros, y no es necesario descargar el paquete de soporte para el idioma chino de IE.
GBK es un estándar basado en el estándar nacional GB2312 y ampliado para ser compatible con GB2312. La codificación de texto de GBK está representada por bytes dobles, es decir, tanto los caracteres chinos como los ingleses están representados por bytes dobles. Para distinguir los caracteres chinos, los bits más altos se establecen en 1. GBK contiene todos los caracteres chinos y es una codificación nacional. Es menos versátil que UTF8, pero UTF8 ocupa una base de datos más grande que GBD.
GBK, GB2312, etc. deben convertirse a UTF8 mediante codificación Unicode:
GBK, GB2312--Unicode--UTF8
UTF8--Unicode--GBK, GB2312
Para un sitio web o foro, si hay muchos caracteres en inglés, se recomienda utilizar UTF-8 para ahorrar espacio. Sin embargo, muchos complementos de foros ahora generalmente solo admiten GBK.
Explicación detallada de la diferencia entre codificaciones. En pocas palabras, los códigos Unicode, gbk y los cinco grandes son los valores codificados, y utf-8, uft-16 y similares son las expresiones de este valor. Los tres códigos anteriores son compatibles. Para el mismo carácter chino, los tres valores del código son completamente diferentes. Por ejemplo, el valor sin codificar de "Han" es diferente de gbk. Supongamos que el valor sin codificar es a040 y gbk es b030, y el código uft-8 es la forma en que se expresa ese valor. El código utf-8 está completamente organizado solo para descodificar. Si GBK desea convertirlo a UTF-8, primero debe convertirlo a descodificar y luego convertirlo a utf-8, y está bien.
Para más detalles, consulte el artículo reimpreso a continuación.
Hablemos sobre la codificación Unicode y expliquemos brevemente términos como UCS, UTF, BMP y BOM. Esta es una lectura interesante escrita por programadores para programadores. La llamada diversión significa que puedes comprender fácilmente algunos conceptos que antes no estaban claros y mejorar tus conocimientos, lo cual es similar a actualizar en un juego de rol. La motivación para organizar este artículo son dos preguntas:
Pregunta uno:
Usando "Guardar como" en el Bloc de notas de Windows, puede convertir entre métodos de codificación GBK, Unicode, Unicode big endian y UTF-8. O puede ir directamente a http://www.knowsky.com/tools/utf8.asp para realizar la conversión en línea.
También es un archivo txt. ¿Cómo identifica Windows el método de codificación?
Descubrí hace mucho tiempo que los archivos de texto codificados Unicode, Unicode bigendian y UTF-8 tendrán algunos bytes más al principio, que son FF, FE (Unicode), FE, FF (Unicode bigendian), EF, BB, BF. (UTF-8). Pero ¿en qué criterios se basan estos marcadores?
Pregunta dos:
Recientemente vi ConvertUTF.c en Internet, que realiza la conversión mutua de UTF-32, UTF-16 y UTF-8. Ya conozco métodos de codificación como Unicode (UCS2), GBK y UTF-8. Pero este programa me confunde un poco y no recuerdo cuál es la relación entre UTF-16 y UCS2.
Después de verificar la información relevante, finalmente aclaré estos problemas y también aprendí algunos detalles sobre Unicode. Escribe un artículo y envíalo a amigos que tengan preguntas similares. Este artículo está escrito de la manera más fácil de entender posible, pero los lectores deben saber qué son los bytes y qué es el hexadecimal.
0. big endian y little endian
big endian y little endian son formas diferentes en que la CPU maneja números multibyte. Por ejemplo, la codificación Unicode del carácter "汉" es 6C49. Entonces, al escribir en un archivo, ¿se debe escribir 6C al frente o 49 al frente? Si 6C se escribe delante, es big endian. Si se escribe 49 delante, es little endian.
La palabra "endian" proviene de "Los viajes de Gulliver". La guerra civil en Lilliput fue causada por romper los huevos del Big-Endian o del Little-Endian. Como resultado, hubo seis rebeliones. Un emperador perdió la vida y otro perdió el trono.
Generalmente traducimos endian como "orden de bytes", y big endian y little endian se denominan "extremo grande" y "extremo pequeño".
1. Codificación de caracteres y código interno. Por cierto, los caracteres de codificación de caracteres chinos deben codificarse antes de que la computadora pueda procesarlos. El método de codificación predeterminado utilizado por la computadora es el código interno de la computadora. Las primeras computadoras usaban codificación ASCII de 7 bits para procesar caracteres chinos, los programadores diseñaron GB2312 para chino simplificado y big5 para chino tradicional.
RFC2781 y RFC3629 del IETF describen los métodos de codificación de UTF-16 y UTF-8 de forma clara, nítida y rigurosa en el estilo consistente de RFC. Siempre olvido que IETF es la abreviatura de Internet Engineering Task Force. Sin embargo, el RFC mantenido por el IETF es la base de todas las especificaciones en Internet.
2.1. Código interno y página de códigos.
Actualmente, el kernel de Windows ya admite el juego de caracteres Unicode, por lo que el kernel puede admitir todos los idiomas del mundo. Sin embargo, dado que una gran cantidad de programas y documentos existentes utilizan una determinada codificación de idioma, como GBK, es imposible que Windows no admita la codificación existente y todos utilicen Unicode.
Windows utiliza páginas de códigos para adaptarse a varios países y regiones. La página de códigos puede entenderse como el código interno mencionado anteriormente. La página de códigos correspondiente a GBK es CP936.
Microsoft también define una página de códigos para GB18030: CP54936. Sin embargo, dado que GB18030 tiene algunas codificaciones de 4 bytes y la página de códigos de Windows solo admite codificaciones de un solo byte y de doble byte, esta página de códigos realmente no se puede utilizar.
3. UCS-2, UCS-4, BMP
UCS viene en dos formatos: UCS-2 y UCS-4. Como sugiere el nombre, UCS-2 está codificado con dos bytes y UCS-4 está codificado con 4 bytes (en realidad, solo se utilizan 31 bits, el bit más alto debe ser 0). Hagamos algunos juegos matemáticos simples:
UCS-2 tiene 2^16=65536 puntos de código y UCS-4 tiene 2^31=2147483648 puntos de código.
UCS-4 se divide en 2^7=128 grupos según el byte más alto, siendo el bit más alto 0. Cada grupo se divide en 256 planos según el siguiente byte más alto. Cada plano se divide en 256 filas según el tercer byte y cada fila contiene 256 celdas. Por supuesto, las celdas de la misma fila solo se diferencian en el último byte y el resto son iguales.
El plano 0 del grupo 0 se denomina Plano Multilingüe Básico o BMP. O en UCS-4, los bits de código cuyos dos bytes superiores son 0 se denominan BMP.
UCS-2 se obtiene eliminando los dos primeros bytes cero del BMP de UCS-4. Agregue dos bytes cero delante de los dos bytes de UCS-2 para obtener el BMP de UCS-4. No hay caracteres asignados fuera del BMP en la especificación UCS-4 actual.
4. Codificación UTF
UTF-8 codifica UCS en unidades de 8 bits. La codificación de UCS-2 a UTF-8 es la siguiente:
Codificación UCS-2 (hexadecimal) Flujo de bytes UTF-8 (binario)
0000-007F 0xxxxxxx
0080-07FF 110xxxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
Por ejemplo, la codificación Unicode de "chino" es 6C49. 6C49 está entre 0800-FFFF, por lo que debe utilizar una plantilla de 3 bytes: 1110xxxx 10xxxxxx10xxxxxx. Escribir 6C49 en binario es: 0110 110001 001001. Usando este flujo de bits para reemplazar x en la plantilla, obtenemos: 1110011010110001 10001001, que es E6 B1 89.
Los lectores pueden utilizar el Bloc de notas para comprobar si nuestra codificación es correcta. Cabe señalar que UltraEdit se convertirá automáticamente a UTF-16 al abrir un archivo de texto codificado en UTF-8, lo que puede causar confusión. Puede desactivar esta opción en la configuración. Una mejor herramienta es Hex Workshop.
UTF-16 codifica UCS en unidades de 16 bits. Para códigos UCS menores que 0x10000, la codificación UTF-16 es igual al entero sin signo de 16 bits correspondiente al código UCS. Para códigos UCS no inferiores a 0x10000, se define un algoritmo. Sin embargo, dado que el BMP del UCS2 o UCS4 realmente utilizado debe ser inferior a 0x10000, por ahora se puede considerar que UTF-16 y UCS-2 son básicamente lo mismo. Sin embargo, UCS-2 es solo un esquema de codificación y UTF-16 se utiliza para la transmisión real, por lo que se debe considerar la cuestión del orden de los bytes.
5. Orden de bytes UTF y BOM
UTF-8 utiliza bytes como unidad de codificación y no tiene problemas de endianidad. UTF-16 utiliza dos bytes como unidad de codificación. Antes de interpretar un texto UTF-16, primero debe comprender el orden de bytes de cada unidad de codificación. Por ejemplo, la codificación Unicode de "Kui" es 594E y la codificación Unicode de "B" es 4E59. Si recibimos el flujo de bytes UTF-16 "594E", ¿es "Ku" o "B"?
El método recomendado para marcar el orden de los bytes en la especificación Unicode es la BOM. BOM no es la lista de BOM de "Lista de materiales", sino una marca de orden de bytes. BOM es una idea un poco inteligente:
Hay un carácter llamado "ZERO WIDTH NO-BREAKSPACE" en la codificación UCS y su codificación es FEFF. FFFE es un carácter que no existe en UCS, por lo que no debería aparecer en la transmisión real. La especificación UCS recomienda que transmitamos los caracteres "ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO" antes de transmitir el flujo de bytes.
De esta manera, si el receptor recibe FEFF, indica que el flujo de bytes es Big-Endian; si recibe FFFE, indica que el flujo de bytes es Little-Endian; Por lo tanto, el carácter "ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO" también se denomina BOM.
UTF-8 no requiere una BOM para indicar el orden de los bytes, pero puede usar la BOM para indicar el método de codificación. La codificación UTF-8 del carácter "ZERO WIDTH NO-BREAKSPACE" es EF BB BF (los lectores pueden verificarlo utilizando el método de codificación que presentamos anteriormente). Entonces, si el receptor recibe un flujo de bytes que comienza con EF BBBF, sabrá que está codificado en UTF-8.
Windows usa BOM para marcar la codificación de archivos de texto.
6. Materiales de referencia adicionales El material de referencia principal para este artículo es "Breve descripción general de ISO-IEC 10646 y Unicode" ( http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html ).
También encontré dos datos que parecían buenos, pero como ya tenía las respuestas a mis preguntas iniciales, no los leí:
"Comprensión de Unicode Una introducción general al estándar Unicode" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a )
"Conceptos básicos de codificación de juegos de caracteres Comprender las codificaciones de juegos de caracteres y las codificaciones heredadas" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03 )
He escrito paquetes de software para convertir UTF-8, UCS-2 y GBK entre sí, incluidas versiones que usan la API de Windows y versiones que no usan la API de Windows. Si tengo tiempo en el futuro, lo arreglaré y lo pondré en mi página de inicio personal ( http://fmddlmyy.home4u.china.com ).
Empecé a escribir este artículo después de pensar en todos los temas y pensé que podría terminarlo en un tiempo. Inesperadamente, me tomó mucho tiempo considerar la redacción y verificar los detalles, y lo escribí entre la 1:30 y las 9:00 de la tarde. Espero que algunos lectores puedan beneficiarse de ello.
Apéndice 1 Hablemos sobre el código de ubicación, GB2312, el código interno y la página de códigos. Algunos amigos todavía tienen preguntas sobre esta oración en el artículo:
"El texto original de GB2312 sigue siendo el código de área. Desde el código de área hasta el código interno, es necesario agregar A0 al byte alto y al byte bajo, respectivamente".
Déjame explicarlo en detalle:
"El texto original de GB2312" se refiere a un estándar nacional de 1980, "Conjunto básico de conjuntos de caracteres codificados chinos para el intercambio de información estándar nacional de la República Popular China GB2312-80". Este estándar utiliza dos números para codificar caracteres chinos y símbolos chinos. El primer número se llama "área" y el segundo número se llama "bit". Por eso también se le llama código de ubicación. Las áreas 1 a 9 son símbolos chinos, las áreas 16 a 55 son caracteres chinos de primer nivel y las áreas 56 a 87 son caracteres chinos de segundo nivel. Ahora Windows también tiene un método de entrada de ubicación, por ejemplo, ingrese 1601 para obtener "ah". (Este método de entrada de ubicación puede reconocer automáticamente los códigos de ubicación hexadecimal GB2312 y decimal, lo que significa que al ingresar B0A1 también obtendrá "ah".)
El código interno se refiere a la codificación de caracteres dentro del sistema operativo. El código interno de los primeros sistemas operativos dependía del idioma. El Windows actual admite Unicode dentro del sistema y luego utiliza páginas de códigos para adaptarse a varios idiomas. El concepto de "código interno" es relativamente vago. Microsoft generalmente se refiere a la codificación especificada por la página de códigos predeterminada como código interno.
No existe una definición oficial del término código interno y la página de códigos es solo el nombre de la empresa Microsoft. Como programadores, siempre que sepamos qué son, no es necesario examinar demasiado estos términos.
La llamada página de códigos (página de códigos) es la codificación de caracteres de un idioma. Por ejemplo, la página de códigos de GBK es CP936, la página de códigos de BIG5 es CP950 y la página de códigos de GB2312 es CP20936.
Windows tiene el concepto de página de códigos predeterminada, es decir, qué codificación se utiliza de forma predeterminada para interpretar caracteres. Por ejemplo, el Bloc de notas de Windows abre un archivo de texto y el contenido que contiene es un flujo de bytes: BA, BA, D7, D6. ¿Cómo debería interpretarlo Windows?
¿Debería interpretarse de acuerdo con la codificación Unicode, GBK, BIG5 o ISO8859-1? Si lo interpreta según GBK, obtendrá la palabra "caracteres chinos". Según otras interpretaciones de codificación, es posible que no se encuentre el carácter correspondiente o que se encuentre el carácter incorrecto. El llamado "error" significa que es inconsistente con la intención original del autor del texto y se producen caracteres confusos.
La respuesta es que Windows interpreta el flujo de bytes en el archivo de texto de acuerdo con la página de códigos predeterminada actual. La página de códigos predeterminada se puede configurar a través de las Opciones regionales en el Panel de control. Hay un elemento ANSI en Guardar como del Bloc de notas, que en realidad guarda de acuerdo con el método de codificación de la página de códigos predeterminada.
El código interno de Windows es Unicode, que técnicamente puede admitir varias páginas de códigos al mismo tiempo. Siempre que el archivo pueda explicar qué codificación utiliza y el usuario haya instalado la página de códigos correspondiente, Windows puede mostrarla correctamente. Por ejemplo, se puede especificar un juego de caracteres en un archivo HTML.
Algunos autores de archivos HTML, especialmente los autores en inglés, creen que todo el mundo usa inglés y no especifican el juego de caracteres en el archivo. Si usa caracteres entre 0x80-0xff y Windows chino los interpreta de acuerdo con el GBK predeterminado, aparecerán caracteres confusos. En este momento, simplemente agregue la declaración que especifica el juego de caracteres al archivo html, por ejemplo:
<meta http-equiv="Tipo de contenido" content="text/html; charset=ISO8859-1">
Si la página de códigos utilizada por el autor original es compatible con ISO8859-1, no habrá caracteres confusos.
Hablemos del código de ubicación. El código de ubicación de Ah es 1601, que es 0x10, 0x01 en hexadecimal. Esto entra en conflicto con la codificación ASCII ampliamente utilizada por las computadoras. Para ser compatible con la codificación ASCII de 00-7f, agregamos A0 a los bytes alto y bajo del código de área respectivamente. De esta forma, el código de "ah" pasa a ser B0A1. También llamamos codificación GB2312 a la codificación con dos A0 agregados, aunque el texto original de GB2312 no menciona esto en absoluto.