¿Cuál es la diferencia entre UTF-8 y GBKUTF8GB2312?
UTF-8: formato de conversión Unicode de 8 bits, la lista de materiales está permitida, pero normalmente no. Es una codificación multibyte que se utiliza para resolver caracteres internacionales. Utiliza 8 bits (es decir, un byte) para inglés y 24 bits (tres bytes) para chino. UTF-8 contiene caracteres necesarios para países de todo el mundo y es una codificación internacional muy versátil. El texto codificado en UTF-8 se puede mostrar en navegadores de diferentes países que admitan el juego de caracteres UTF8. Por ejemplo, si se trata de codificación UTF8, los extranjeros también pueden mostrar chino en IE en inglés sin descargar el paquete de soporte de idioma chino de IE.
GBK es el estándar nacional GB2312 y será compatible con GB2312 después de la expansión. 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, el bit más alto se establece en 1. GBK contiene todos los caracteres chinos y es el código de país, que es peor que UTF8, pero UTF8 ocupa una base de datos más grande que GBK.
GBK, GB2312 y UTF8 deben estar codificados en Unicode antes de poder convertirse entre sí:
GBK, GB2312 - Unicode - UTF8
UTF8 - Unicode - GBK, GB2312
PCSS5 es solo funcionalmente hablando:
1 y GBK generalmente significan que la codificación GB2312 solo admite caracteres chinos simplificados.
2.utf generalmente se refiere a UTF-8, que admite chino simplificado, chino tradicional, inglés, japonés, coreano y otros idiomas (el rango de caracteres admitidos es más amplio).
3. UTF-8 y gb2312 se utilizan generalmente en China, según sus propias necesidades.
Los detalles son los siguientes:
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 los dos códigos
En pocas palabras, los códigos Unicode, gbk y Big Five son valores de codificación, utf-8, uft-16 y similares son esta expresión de valor. Pero los primeros tres códigos son compatibles y los tres códigos para el mismo carácter chino 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 0. Los códigos Utf-8 están organizados solo para descodificar. Si GBK quiere convertir UTF-8, primero debe convertirlo a código sin codificar, y luego UTF-8 será suficiente.
Consulta el artículo que se envía a continuación para obtener más detalles.
Hablemos de la codificación Unicode y expliquemos brevemente algunos términos como UCS, UTF, BMP y BOM.
Esta es una lectura interesante para programadores. La llamada diversión significa que puedes comprender fácilmente algunos conceptos poco claros y mejorar tus conocimientos, similar a actualizar un juego de rol. La motivación para organizar este artículo son dos preguntas:
Pregunta 1:
Guardar como en Windows El Bloc de notas se puede usar para guardar en GBK, Unicode, Unicode big endian y UTF-8 Convert. entre. Para el mismo archivo txt, ¿cómo identifica Windows el método de codificación?
Hace mucho tiempo descubrí que los archivos de texto codificados Unicode, Unicode bigendian y UTF-8 tendrán varios bytes adicionales al principio, a saber, FF, FE (Unicode), FE, FF (Unicode bigendian). , EF, BB, BF (UTF-8). Pero ¿en qué criterios se basan estos signos?
Pregunta 2:
Recientemente vi un ConvertUTF.c en Internet, que realiza la conversión mutua de UTF-32, UTF-16 y UTF-8. Solía saber sobre codificación Unicode (UCS2), GBK y UTF-8. Pero este programa me confunde un poco, no recuerdo que tiene que ver UTF-16 con UCS2.
Después de verificar la información relevante, finalmente descubrí estos problemas y aprendí algunos detalles de Unicode. Escribe un artículo y envíalo a amigos que hayan tenido problemas 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 las que la CPU maneja números multibyte. Por ejemplo, la codificación Unicode del chino es 6C49. Entonces, al escribir en un archivo, ¿debería escribir 6C delante o 49 delante? Si se escribe 6C delante, es big endian. Si se escribe 49 delante, es little endian.
La palabra "endian" proviene de "Los viajes de Gulliver". La guerra civil del villano comenzó sobre si el huevo se rompió por el extremo grande o por el extremo pequeño, ocurrieron seis rebeliones, un emperador murió y otro perdió su trono.
Por lo general, traducimos endian al orden de bytes y llamamos a big endian y little endian "final grande" y "extremo pequeño" respectivamente.
1. Codificación de caracteres, código interno y codificación de caracteres chinos, por cierto.
Los caracteres deben codificarse antes de que puedan ser procesados por el ordenador. El método de codificación predeterminado utilizado por una computadora es el código interno de la computadora. Las primeras computadoras usaban codificación ASCII de 7 bits. Para manejar caracteres chinos, los programadores diseñaron GB2312 para chino simplificado y big5 para chino tradicional.
GB2312(1980) A * *Contiene 7445 caracteres, incluidos 6763 caracteres chinos y otros 682 símbolos. El rango de código en el área de caracteres chinos va desde B0-F7 en el byte alto hasta A1-FE en el byte bajo, ocupando 72*94=6768 bits de código. Cinco de ellos son D7FA-D7FE.
GB2312 admite muy pocos caracteres chinos. La especificación de extensión de caracteres chinos GBK1.0 de 1995 contiene 21886 símbolos, que se dividen en área de caracteres chinos y área de símbolos gráficos. El área de caracteres chinos incluye 21.003 caracteres.
Desde ASCII, GB2312 hasta GBK, estos métodos de codificación son compatibles con versiones anteriores, es decir, los mismos caracteres siempre tienen la misma codificación en estos esquemas y los estándares posteriores admiten más caracteres. En estos códigos, el inglés y el chino se pueden procesar de manera uniforme. La forma de distinguir los códigos chinos es que el bit más alto del byte alto no es 0. Según el nombre del programador, tanto GB2312 como GBK pertenecen a conjuntos de caracteres de doble byte (DBCS).
En 2000, GB18030 reemplazó a GBK1.0 como estándar nacional oficial. El estándar contiene 27.484 caracteres chinos, además de tibetano, mongol, uigur y otros idiomas minoritarios importantes. Del vocabulario de caracteres chinos, GB18030 agrega 6582 caracteres chinos de la extensión CJK A (Unicode 0x3400-0x4db5) a los 20902 caracteres chinos de GB13000.1, y un * * contiene 27484 caracteres chinos.
CJK significa China, Japón y Corea del Norte. Unicode codifica caracteres en los tres idiomas de China, Japón y Corea para ahorrar bits de código. GB13000.1 es la versión china de ISO/IEC 10646-1, equivalente a Unicode 1.1.
La codificación de GB18030 adopta esquemas de un solo byte, doble byte y 4 bytes. Entre ellos, los de un solo byte, de doble byte y GBK son totalmente compatibles. Los bits de código de la codificación de 4 bytes son 6582 caracteres chinos, incluida la extensión CJK a. Por ejemplo, la codificación de 0x3400 de UCS en GB18030 debe ser 8139EF30 y la codificación de 0x3401 de UCS en GB18030 debe ser 8139EF31.
Microsoft proporciona un paquete de actualización para GB18030, pero este paquete de actualización solo proporciona un nuevo conjunto de fuentes que admiten 6582 caracteres chinos de la extensión CJK A: New Song Dynasty-18030, sin cambiar el código interno. El código interno de Windows sigue siendo GBK.
Los siguientes son algunos detalles:
El texto original de GB2312 sigue siendo un código de posición. Desde el código de posición hasta el código interno, agregue 0 al byte alto y al byte bajo respectivamente.
Para cualquier codificación de caracteres, el orden de las unidades de codificación lo especifica el esquema de codificación, independientemente del endian. Por ejemplo, la unidad de codificación de GBK es el byte y dos bytes representan un carácter chino. El orden de estos dos bytes es fijo y no se ve afectado por el orden de bytes de la CPU.
La unidad de codificación de UTF-16 es una palabra (doble byte). El orden entre las palabras lo especifica el esquema de codificación, por lo que la disposición de los bytes en la palabra se verá afectada por el endian. UTF-16 se introducirá más adelante.
El bit más alto de los dos bytes de GB2312 es 1. Pero sólo 128 * 128 = 16384 puntos de código satisfacen esta condición. Por lo tanto, es posible que el byte más bajo y el bit más alto de GBK y GB18030 no sean 1. Pero esto no afecta el análisis del flujo de caracteres DBCS: al leer el flujo de caracteres DBCS, siempre que el byte de orden superior sea 1, los dos bytes siguientes se pueden codificar como bytes dobles, independientemente del byte de orden superior.
2. Unicode, UCS y UTF
Los métodos de codificación mencionados anteriormente, desde ASCII, GB2312, GBK a GB18030, son todos compatibles con versiones anteriores. Unicode sólo es compatible con ASCII (más precisamente, es compatible con ISO-8859-1) y no es compatible con el código GB. Por ejemplo, el código Unicode chino es 6C49 y el código GB es BABA.
Unicode también es un método de codificación de caracteres, pero fue diseñado por una organización internacional y puede acomodar esquemas de codificación para todos los idiomas y caracteres del mundo. El nombre científico de Unicode es "Conjunto de caracteres codificados universales de múltiples octetos", abreviado como UCS. UCS puede verse como la abreviatura de "juego de caracteres Unicode".
Según la abreviatura de Engineering Task Force. Pero los RFC mantenidos por el IETF son 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 todos los idiomas y caracteres del mundo pueden ser admitidos en el kernel. . Sin embargo, dado que una gran cantidad de programas y documentos existentes utilizan codificaciones específicas del idioma, como GBK, es imposible que Windows cambie a Unicode sin admitir codificaciones existentes.
Windows utiliza páginas de códigos para adaptarse a diferentes países y regiones. Las páginas de códigos pueden entenderse como los códigos internos mencionados anteriormente. La página de códigos correspondiente a GBK es CP936.
Microsoft también definió la página de códigos: CP 54936 para GB18030. Pero 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 tiene dos formatos: UCS-2 y UCS-4. Como sugiere el nombre, UCS-2 está codificado con dos bytes y UCS-4 está codificado con cuatro bytes (en realidad, solo se utilizan 31 bits y el bit más alto debe ser 0). Hagamos algunos cálculos 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, el punto de código cuyos dos bytes superiores son 0 se llama BMP.
UCS-2 se puede obtener eliminando los dos primeros bytes cero del BMP de UCS-4. Agregue dos bytes cero antes de los dos bytes de UCS-2 para obtener el BMP de UCS-4. Sin embargo, en la especificación UCS-4 actual, no hay caracteres asignados fuera del BMP.
Codificación 4.UTF
UTF-8 codifica UCS en unidades de 8 bits. El método de codificación de UCS-2 a UTF-8 es el siguiente:
Secuencia de 8 bytes UTF codificada con UCS-2 (binario)
0000 - 007F 0xxxxxxx
0080-07FF 110 xxxxx 10 xxxxx
0800-FFFF 1110 xxxxx 10 xxxxx 10 xxxxx
Por ejemplo, la codificación Unicode china es 6C49.
6C49 está entre 0800 y ffff, por lo que se debe utilizar una plantilla de 3 bytes: 110 xxxxx 10 xxxxx 10 xxxxx. Escriba 6C49 como binario: 0110010101001 y utilice este flujo de bits para reemplazar la X en la plantilla. Obtenemos: 1110010110001,1001.
Los lectores pueden utilizar el Bloc de notas para comprobar si nuestra codificación es correcta. Es importante tener en cuenta que UltraEdit se convierte automáticamente a UTF-16 al abrir archivos de texto codificados 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 16 sin signo correspondiente al código UCS. Para códigos UCS no inferiores a 0x10000, se define un algoritmo. Sin embargo, dado que el BMP real utilizado por UCS2 o UCS4 debe ser inferior a 0x10000, actualmente se puede considerar que UTF-16 y UCS-2 son básicamente iguales. Sin embargo, UCS-2 es solo un esquema de codificación y la transmisión real utiliza UTF-16, 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, por lo que no hay problema de orden de bytes. UTF-16 utiliza dos bytes como unidad de codificación. Antes de interpretar el texto UTF-16, primero debemos averiguar 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 una "pérdida" o una "B"?
El método recomendado para marcar el orden de bytes en la especificación Unicode es la BOM. La lista de materiales no es una lista de materiales de "lista de materiales", sino una marca de orden de bytes. BOM es una idea inteligente:
Hay un carácter en la codificación UCS llamado "ancho cero sin separador" y su codificación es FEFF. FFFE es una función inexistente 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 separación de ancho cero" antes de transmitir el flujo de bytes.
De esta manera, si el receptor recibe FEFF, significa que el flujo de bytes es Big-Endian; si recibe FFFE, significa que el flujo de bytes es little-endian. Por lo tanto, el carácter "ancho cero sin espacio de nueva línea" también se denomina lista de materiales.
UTF-8 no requiere una lista de materiales para representar el orden de bytes, pero se puede utilizar para representar la codificación. La codificación UTF-8 del carácter "espacio sin separación de ancho cero" 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 se trata de codificación UTF-8.
Windows utiliza BOM para marcar la codificación de archivos de texto.
6. Más materiales de referencia
El material de referencia principal para este artículo es "http://www.nada.kth.se/i18n/UCS/Unicode-ISO 10646-oview html ISO-IEC 10646 y descripción general de Unicode".
También encontré dos materiales que parecían buenos pero no los miré porque encontré las respuestas a todas mis preguntas originales:
"Comprensión de la introducción general de Unicode a la introducción al estándar Unicode "(http://scripts.sil.org/cms/scripts/page.php?siteid=nrsi&item_id=IWS-Chapter 04a)
"Comprender los conceptos básicos de la codificación de juegos de caracteres Codificación de juegos de caracteres y codificación tradicional " (http://scripts.sil.org/cms/scripts/page.php?siteid=nrsi&item_id=IWS-Chapter 3)
Escribo paquetes que convierten UTF-8, UCS-2 y GBK , tanto los que utilizan la API de Windows como los que no.
Si tengo tiempo en el futuro, lo pondré en mi página de inicio personal.
Empecé a escribir este artículo después de pensar en todos los temas. Pensé que se haría rápidamente. Inesperadamente, tomó mucho tiempo considerar la redacción y verificar los detalles, incluso desde 65438+0:30 p.m. hasta 9:00 p.m. Espero que algunos lectores puedan beneficiarse de ello.
El Apéndice 1 habla primero sobre el código de área, 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 un código de posición. Desde el código de posición hasta el código interno, el byte alto y el byte inferior debe estar separado. Agregue un A0."
Permítame explicarlo en detalle:
El texto original de "GB2312" se refiere a un estándar nacional de 1980 "Conjunto básico de caracteres chinos". Conjunto de caracteres codificados para el intercambio de información estándar de la República Popular China"* **Y 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 "bits". Por eso también se le llama código de posicionamiento. Del 1 al 9 son símbolos de caracteres chinos, del 16 al 55 son caracteres chinos de primer nivel y del 56 al 87 son caracteres chinos de segundo nivel. Ahora Windows también tiene un método de entrada de ubicación. Por ejemplo, si ingresa 1601, puede obtener "ah". (Este método de entrada de posición puede identificar automáticamente los códigos de posición GB2312 y 10 en 16, lo que significa que también puede obtener "ah" al ingresar B0A1).
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 era específico del idioma. Ahora Windows admite Unicode en el sistema y luego utiliza páginas de códigos para adaptarse a varios idiomas, por lo que el concepto de "código interno" es relativamente vago. Microsoft generalmente se refiere al código especificado en la página de códigos predeterminada como código interno.
El término código interno no tiene una definición oficial, página de códigos es solo el nombre de Microsoft. Como programador, siempre que sepa cuáles son, no es necesario examinar demasiado estos términos.
La llamada 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.
Existe un concepto de página de códigos predeterminada en Windows, que es la codificación predeterminada utilizada para interpretar caracteres. Por ejemplo, el Bloc de notas de Windows abre un archivo de texto que contiene una secuencia de bytes: BA, BA, D7, D6. ¿Cómo debería Windows explicar esto?
¿Se interpreta según codificación Unicode, GBK, BIG5 o ISO8859-1? Si lo interpretas según GBK, obtendrás la palabra "kanji". Dependiendo de 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, lo que resulta en 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 ANSI en Guardar como del Bloc de notas, que en realidad se 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 indique qué codificación está utilizando y el usuario tenga instalada la página de códigos adecuada, Windows la mostrará correctamente. Por ejemplo, se puede especificar un juego de caracteres en un archivo HTML.
Algunos autores de documentos HTML, especialmente autores ingleses, creen que todo el mundo usa inglés y no especifican el juego de caracteres en el documento. Si usa caracteres entre 0x80 y 0xff, y Windows chino los interpreta de acuerdo con el GBK predeterminado, aparecerán caracteres confusos. En este momento, simplemente agregue una declaración que especifique el juego de caracteres al archivo html, como por ejemplo:
& ltmeta http-equiv = " Content-Type " 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.
Además del código de posición, el código de posición de Ah es 1601, escrito como 16, y la notación hexadecimal es 0x10 y 0x001. Esto entra en conflicto con la codificación ASCII ampliamente utilizada en las computadoras.
Para ser compatible con la codificación ASCII 00-7f, agregamos un 0 a los bytes alto y bajo del código de área. Entonces el código de "Ah" se convierte en B0A1. Agregamos dos códigos A0 más, también llamados códigos GB2312, aunque el texto original de GB2312 no menciona esto en absoluto.