Método de codificación método de codificación

Comprender las características de codificación comunes es la base para resolver problemas de codificación de juegos de caracteres. La identificación y conversión de codificaciones de juegos de caracteres, el análisis de las causas de varios caracteres confusos, las operaciones de programación de varias cadenas codificadas (como el cálculo del número de caracteres, el procesamiento de truncamiento), etc., deben comprender las características de la codificación.

Comprender la codificación de un juego de caracteres es principalmente comprender el rango de codificación de la codificación, el juego de caracteres correspondiente a la codificación (qué caracteres están incluidos) y la relación entre otras codificaciones de juegos de caracteres, etc.

ASCII

El código ASCII es un código de 7 bits y el rango de codificación es 0x00-0x7F. El juego de caracteres ASCII incluye caracteres como letras inglesas, números arábigos y signos de puntuación. Entre ellos, 0x00-0x1F y 0x7F*** son 33 caracteres de control.

Los sistemas que solo admiten código ASCII ignorarán el bit más alto de cada byte y solo considerarán los 7 bits inferiores como bits válidos. La codificación de caracteres HZ es una de las primeras codificaciones diseñadas para transmitir chino en sistemas que solo admiten ASCII de 7 bits. Al principio, muchos sistemas de correo electrónico solo admitían la codificación ASCII. Para transmitir correos electrónicos chinos, se debe utilizar BASE64 u otros métodos de codificación.

GB2312

GB2312 está diseñado en base al código de área. El código de área divide la tabla de codificación en 94 áreas, cada área corresponde a 94 bits y el código de área y el número de bits. cada carácter La combinación es el código de ubicación del carácter chino. El código de área generalmente se representa mediante un número decimal. Por ejemplo, 1601 significa 1 dígito en el área 16 y el carácter correspondiente es "ah". Agregue 0xA0 al código de área y al número de bit del código de área para obtener la codificación GB2312.

En el código de área, las áreas 01-09 son símbolos y números, las áreas 16-87 son áreas de caracteres chinos y las áreas 10-15 y 88-94 son áreas en blanco no definidas. Divide los caracteres chinos recopilados en dos niveles: el primer nivel contiene 3755 caracteres chinos de uso común, que se colocan en las áreas 16 a 55 y están organizados en el orden de letras pinyin chinas/formas de trazos; el segundo nivel incluye 3008 caracteres chinos de uso común; Caracteres chinos, colocados en el área 56 -87, ordenados en orden radical/trazo. Los caracteres chinos de primer nivel se ordenan según pinyin. Esto se puede utilizar para obtener el rango de un determinado pinyin en la ubicación de los caracteres chinos de primer nivel. Muchos programas que pueden obtener pinyin basados ​​​​en caracteres chinos están escritos de acuerdo con este principio.

Además de los caracteres chinos simplificados de uso común, el conjunto de caracteres GB2312 también incluye letras griegas, letras japonesas hiragana y katakana, letras cirílicas rusas y otros caracteres del chino tradicional, y algunos caracteres raros no están incluidos. Puede utilizar caracteres chinos tradicionales para comprobar si algunos sistemas solo admiten la codificación GB2312.

El rango de codificación de GB2312 es 0xA1A1-0xFEFE. Después de eliminar el área indefinida, se puede entender que el rango de codificación real es 0xA1A1-0xF7FE.

EUC-CN puede entenderse como un alias de GB2312, que es exactamente igual a GB2312.

El código de ubicación debe considerarse como la definición del juego de caracteres, que define los caracteres incluidos y las posiciones de los caracteres GB2312 y EUC-CN son los códigos que admiten este juego de caracteres en el entorno informático real. HZ e ISO-2022-CN son las otras dos codificaciones correspondientes al conjunto de caracteres del código de ubicación. Ambas utilizan un espacio de codificación de 7 bits para admitir caracteres chinos. La relación entre el código de ubicación y la codificación GB2312 es un poco como Unicode y UTF-8.

GBK

La codificación GBK es un superconjunto de la codificación GB2312 y es totalmente compatible con GB2312. Al mismo tiempo, GBK incluye todos los caracteres chinos CJK en el plano multilingüe básico Unicode. Al igual que GB2312, GBK también admite letras griegas, letras kana japonesas, letras rusas y otros caracteres, pero no admite caracteres fonéticos (caracteres no chinos) en coreano. GBK también incluye símbolos radicales chinos, signos de puntuación verticales y otros caracteres que no están incluidos en GB2312.

El rango de codificación general de GBK es 0x8140-0xFEFE, excluyendo la combinación de byte bajo 0×7F. El rango de bytes alto es 0×81-0xFE y el rango de bytes bajo es 0x40-7E y 0x80-0xFE.

Los caracteres GBK cuyo byte bajo es 0x40-0x7E tienen ciertas especialidades, porque estos caracteres ocupan la posición del código ASCII, lo que causará problemas a algunos sistemas.

Algunos sistemas utilizan caracteres en 0x40-0x7E (como "|") como símbolos especiales al ubicar estos símbolos, no determinan si pertenecen al byte bajo de un determinado carácter GBK. manera conducirá a un juicio erróneo. Este problema no existe en un entorno que admita GB2312. Cabe señalar que en un entorno que admite GBK, un byte menor que 0x80 puede no ser un símbolo ASCII. Además, es mejor usar símbolos ASCII menores que 0x40 para crear algunos símbolos especiales, para que pueda hacerlo rápidamente; ubíquelo sin preocuparse de si se trata de un símbolo determinado. La otra mitad del carácter chino. También existen problemas correspondientes en la codificación Big5.

Existen ligeras diferencias entre CP936 y GBK. En la mayoría de los casos, CP936 se puede utilizar como alias para GBK.

GB18030

La codificación GB18030 es compatible con GBK y GB2312. La compatibilidad significa que no solo los caracteres son compatibles, sino que la codificación de los mismos caracteres también es la misma. GB18030 incluye todos los caracteres en Unicode3.1, incluidos los caracteres minoritarios chinos, los caracteres coreanos no admitidos por GBK, etc. También se puede decir que se incluyen los símbolos de texto de la mayoría de los grupos étnicos del mundo.

GBK y GB2312 son codificaciones de doble byte de igual ancho. Si incluye la de un solo byte compatible con la compatibilidad ASCII, también pueden entenderse como codificaciones de longitud variable que combinan un solo byte y doble. bytes. La codificación GB18030 es una codificación de longitud variable, que tiene tres modos: byte único, byte doble y cuatro bytes.

El rango de codificación de un solo byte de GB18030 es 0x00-0x7F, que es completamente equivalente a ASCII. El rango de codificación de doble byte es el mismo que el de GBK, el byte alto es 0x81-0xFE y el byte bajo. el rango de codificación de bytes es 0x40 -0x7E y 0x80-FE; en codificación de cuatro bytes, el rango de codificación del primer y tercer bytes es 0x81-0xFE, y el segundo y cuarto bytes son 0x30-0x39.

La página de códigos CP936 en Windows usa 0x80 para representar el símbolo del euro, pero el bit de codificación 0x80 no se usa en la codificación GB18030 y se usan otras posiciones para representar el símbolo del euro. Esto puede entenderse como un pequeño problema con la compatibilidad con versiones anteriores de GB18030. También puede entenderse que 0x80 es una extensión de CP936 a GBK, mientras que GB18030 solo es compatible con GBK.

BIG5

Big5 es una codificación de doble byte. El rango de codificación de bytes altos es 0x81-0xFE y el rango de codificación de bytes bajos es 0x40-0x7E y 0xA1-0xFE. En comparación con GBK, el byte bajo que falta es la combinación de 0x80-0xA0. 0x8140-0xA0FE es un área reservada para personajes creados por el usuario.

Los caracteres chinos incluidos en Big5 solo incluyen caracteres chinos tradicionales, no caracteres chinos simplificados y algunos caracteres chinos raros no están incluidos. Los caracteres japoneses Kana y los caracteres rusos Big5 incluidos en GBK tampoco están incluidos. Debido a que los caracteres incluidos en Big5 son limitados, hay muchos códigos que se amplían en Big5, como el sistema chino Yitian. La página de códigos CP950 utilizada en los sistemas Windows también puede entenderse como una extensión de Big5, agregando 7 caracteres chinos y algunos símbolos sobre la base de Big5. El juego de caracteres correspondiente a la codificación Big5 es un subconjunto del juego de caracteres GBK, lo que significa que los caracteres incluidos en Big5 son parte de los caracteres incluidos en GBK, pero los mismos caracteres tienen codificaciones diferentes.

Debido a que Big5 también ocupa el espacio de codificación ASCII (0x40-0x7E usado por el byte bajo), la codificación Big5 tiene el mismo problema que la codificación GBK en algunos entornos, es decir, el rango de bytes bajos es 0x40 Los caracteres de -0x7E puede ser mal manejado, especialmente los caracteres cuyo byte bajo es 0x5C ("/") y 0x7C ("|"). Puede consultar las instrucciones correspondientes en la sección GBK.

Aunque existen algunas diferencias, en la mayoría de los casos CP950 puede considerarse como un alias de Big5.

ISO-8859-1

La codificación ISO-8859-1 es una codificación de un solo byte, compatible con versiones anteriores de ASCII, su rango de codificación es 0x00-0xFF y todo el rango es 0x00-0x7F Consistente con ASCII, 0x80-0x9F son caracteres de control y 0xA0-0xFF son símbolos de texto.

Además de los caracteres incluidos en ASCII, los caracteres incluidos en ISO-8859-1 también incluyen símbolos de texto correspondientes a idiomas de Europa occidental, griego, tailandés, árabe y hebreo. El símbolo del euro apareció relativamente tarde y no está incluido en la norma ISO-8859-1.

Debido a que el rango de codificación ISO-8859-1 utiliza todo el espacio dentro de un solo byte, cualquier otro flujo de bytes de codificación no se descartará cuando se transmita y almacene en un sistema que admita ISO-8859-1. En otras palabras, no hay ningún problema en tratar cualquier otro flujo de bytes codificado como codificación ISO-8859-1. Esta es una característica muy importante. La codificación predeterminada de la base de datos MySQL es Latin1, que aprovecha esta característica. La codificación ASCII es un contenedor de 7 bits y la codificación ISO-8859-1 es un contenedor de 8 bits.

Latin1 es un alias de ISO-8859-1 y está escrito como Latin-1 en algunos entornos.

UCS-2 y UTF-16

Tanto la organización Unicode como la organización ISO están intentando definir un conjunto de caracteres muy grande, con el propósito de cubrir los caracteres utilizados por todos los idiomas. ​así como algunos caracteres especiales utilizados por otras disciplinas de Símbolos, este conjunto de caracteres es el Conjunto de Caracteres Universal (UCS, Universal Character Set). Las dos organizaciones han estado coordinadas y, aunque se desarrollan por separado, las posiciones de carácter definidas son completamente consistentes. La norma ISO correspondiente es ISO 10646. Tanto Unicode como ISO 10646 están en proceso de desarrollo continuo, por lo que habrá diferentes números de versión para indicar diferentes etapas de desarrollo. Para cada número de versión Unicode, se puede encontrar el número de versión ISO 10646 correspondiente.

El estándar ISO 10646 define un juego de caracteres de 31 bits. La posición de los dos primeros bytes (0x0000-0xFFFD) se denomina plano multilingüe básico (BMP) y el rango más allá de los dos bytes se denomina plano de lenguaje auxiliar. Básicamente, BMP incluye la mayoría de los caracteres en todos los idiomas, por lo que, siempre que sea compatible con BMP, puede admitir aplicaciones en la mayoría de situaciones. El juego de caracteres correspondiente a Unicode 3.0 está dentro del rango BMP.

El juego de caracteres UCS asigna una posición a cada carácter, generalmente usando "U" más el número hexadecimal de la posición de un carácter en UCS como la representación UCS de este carácter, como por ejemplo "U+ 0041" representa el carácter. "A". Los caracteres UCS U+0000 a U+00FF son completamente consistentes con ISO-8859-1.

UCS-2 y UTF-16 son los métodos de codificación específicos utilizados en aplicaciones prácticas del juego de caracteres UCS (o juego de caracteres Unicode). UCS-2 es una codificación de dos bytes de igual ancho. Debido a que solo utiliza dos bytes de espacio de codificación, solo puede codificar caracteres en BMP. UTF-16 es una codificación de longitud variable que utiliza dos bytes para codificar caracteres en BMP y 4 bytes para codificar caracteres en el plano auxiliar más allá del rango de BMP.

UCS-2 es diferente de GBK y Big5. Es una codificación verdadera de igual ancho. Cada carácter utiliza dos bytes. Esta característica es muy conveniente para el truncamiento de cadenas y el cálculo del recuento de caracteres.

UTF-16 es un superconjunto de UCS-2. El método de codificación de dos bytes de UTF-16 es exactamente el mismo que UCS-2. Es decir, dentro del marco de BMP, UCS-. 2 es completamente equivalente a UTF -16. En la práctica, UCS-16 se utiliza a menudo como alias de UCS-2.

UCS-2 y UTF-16 utilizan dos órdenes de bytes diferentes al almacenar y transmitir, a saber, big endian y little endian (big endian y little endian). Por ejemplo, "ah" (U+554A) se representa con big endian como 0x554A y little endian se representa como 0x4A55. El orden de bytes predeterminado de UCS-2 y UTF-16 es big endian. Durante el proceso de transmisión, para indicar el orden de los bytes, se debe agregar una BOM (marca de orden de bytes) antes del flujo de bytes. 0xFEFF indica big endian y 0xFFFE indica little endian.

UCS-2BE y UCS-2LE son nombres de codificación utilizados en aplicaciones prácticas, correspondientes a big endian y little endian, al igual que UTF-16BE y UTF-16LE. Debido a que el orden de bytes predeterminado es BE, UCS-2 puede considerarse como un alias de UCS-2BE.

Hay un carácter llamado "ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO" en la codificación UCS. Su codificación es U+FEFF, que es un carácter sin significado práctico. La especificación UCS recomienda que transmitamos el carácter "ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO" antes de transmitir el flujo de bytes. Si el ESPACIO SIN INTERRUPCIÓN DE ANCHO CERO transmitido es 0xFEFF, significa big endian; de lo contrario, es little endian.

UCS-2 y UTF-16 también pueden entenderse como compatibles con ASCII e ISO-8859-1. Agregue 0x00 antes de cada byte en la codificación ASCII o ISO-8859-1 y obtendrá el UCS. -2 codificación del carácter correspondiente.

UCS-2 y UTF-16 usarán 0x00 como parte de una determinada codificación de caracteres. Algunos sistemas usarán 0x00 como signo del final de la cadena al procesar la codificación UCS-2 o UTF-16. se producirán problemas.

UTF-8

UTF-8 es otro método de codificación del juego de caracteres UCS. Cada unidad de UTF-16 tiene dos bytes (16 bits), mientras que UTF cada unidad de -. 8 es un byte (8 bits). Se utilizan uno o dos bytes dobles para representar un carácter en UTF-16 y uno o varios bytes individuales para representar un carácter en UTF-8.

Se puede considerar que la codificación UTF-8 se convierte de UCS-2 de acuerdo con ciertas reglas. Existe la siguiente relación de conversión entre UCS-2 y UTF-8:

UCS. -2 UTF-8

U+0000 - U+007F 0xxxxxxx

U+0080 - U+07FF 110xxxxx 10xxxxxx

U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx

Por ejemplo, la codificación UCS-2 de la palabra "ah" es 0x554A y el binario correspondiente es 0101 0101 0100 1010. El binario después de convertir a codificación UTF-8 es 1110 0101 10 010101 10 001010, y los diez correspondientes. El valor hexadecimal es 0xE5958A.

UCS-4 también es un método de codificación del juego de caracteres UCS. Utiliza una codificación de ancho igual de 4 bytes que se puede utilizar para representar caracteres auxiliares distintos de BMP. Agregar 0x0000 antes de cada dos bytes en UCS-2 da como resultado la codificación UCS-4 de caracteres BMP. También existe una relación de conversión de UCS-4 a UTF-8. Según esta relación de conversión, UTF-8 puede utilizar hasta seis bytes para codificar UCS-4.

De acuerdo con las reglas de generación de UTF-8 y las características del juego de caracteres UCS, se pueden ver las características de UTF-8:

UTF-8 es completamente compatible con ASCII , es decir, ASCII Los caracteres correspondientes son exactamente los mismos que la codificación ASCII en UTF-8. Los caracteres dentro del rango de 0x00-0x7F deben ser caracteres ASCII y no pueden formar parte de otros caracteres. Los fallos que existen tanto en GBK como en Big5 no existen en UTF-8.

Los caracteres UCS mayores que U+007F tienen al menos dos bytes en codificación UTF-8.

El primer byte de cada codificación de caracteres en UTF-8 siempre está entre 0x00-0xFD (independientemente del soporte de UCS-4, el primer byte está entre 0x00-0xEF). Con base en el primer byte, puede determinar cuántos bytes consecutivos le siguen.

Otros bytes además del primer byte están entre 0x80-0xBF; 0xFE y 0xFF no se utilizan en UTF-8.

Todos los caracteres chinos en codificación GBK están en el rango UCS-2 entre U+0800 - U+FFFF, por lo que la codificación UTF-8 de cada carácter chino en codificación GBK es de 3 bytes. Pero la codificación UTF-8 de otros caracteres incluidos en GBK no es necesariamente de 3 bytes, como los caracteres rusos en GBK.

Incluso si se pierde un byte durante el proceso de transmisión de codificación UTF-8, la posición perdida se puede localizar fácilmente de acuerdo con las reglas de codificación sin afectar a otros caracteres. En otras codificaciones de doble byte, una vez que se pierde un byte, todos los caracteres que siguen a este byte se ven afectados. Desde este punto podemos ver que la codificación UTF-8 es muy adecuada como codificación de transferencia