Un artículo para comprender la codificación de caracteres de Python (método de codificación, caracteres confusos y motivos de error)

1. El surgimiento de la codificación de caracteres.

  • Debido a que las computadoras solo pueden procesar números, si desea procesar texto, primero debe convertir el texto a números antes de poder procesarlo.

  • Por lo tanto, la codificación de caracteres consiste en formular una tabla de códigos para corresponder caracteres y códigos (que pueden entenderse simplemente como números). La codificación de caracteres corresponde de forma única a cada carácter con un código. De esta forma podemos guardar el código correspondiente al carácter en la computadora, y cuando lo veamos, el carácter correspondiente se puede mostrar a través de la tabla de códigos.

2. Diferentes métodos de codificación

¿El enfoque anterior parece perfecto? Pero desafortunadamente hay miles de idiomas en el mundo y es muy difícil agregar caracteres de todos los idiomas. Por lo tanto, muchos países tienen sus propios códigos. Por ejemplo, gbk es el código estándar nacional utilizado en China. Japón codifica el japonés como Shift_JIS y Corea del Sur codifica el coreano como Euc-kr . Cada país puede tener sus propios estándares de codificación y, si se utilizan diferentes métodos de codificación, pueden aparecer caracteres confusos. Las siguientes son algunas de las codificaciones más comunes:

  1. codificación ASCII

Al principio, solo se codificaban 127 caracteres en la computadora, es decir, letras inglesas mayúsculas y minúsculas, números y algunos símbolos. Esta tabla de códigos se llama código ASCII .

  1. Codificación GB2312 y GBK

China formuló el código GB2312 , que se utilizó para codificar el chino, y luego emitió el código GBK . GB2312 es una especificación de codificación de caracteres chinos simplificados, pero GBK es un conjunto de caracteres grande, que no solo incluye chino simplificado, sino que también el chino tradicional incluye caracteres de doble byte de todos los idiomas asiáticos, como el japonés y el coreano.

  1. conjunto de caracteres Unicode

Para resolver el problema de los caracteres confusos causados ​​por diferentes codificaciones, surgió el juego de caracteres Unicode. Unicode unifica todos los idiomas en un conjunto de códigos, para que no haya más caracteres confusos. Unicode también se conoce como Unicode y Unicode. Establece un código binario unificado y único para cada carácter en cada idioma para cumplir con los requisitos de conversión y procesamiento de texto en todos los idiomas y plataformas.

  1. UTF-8

Si se unifica en codificación Unicode, el problema de los caracteres confusos desaparecerá a partir de ese momento. Sin embargo, si el texto que escribe está básicamente todo en inglés, usar la codificación Unicode requiere el doble de espacio de almacenamiento que la codificación ASCII, lo cual es muy antieconómico en términos de almacenamiento y transmisión. Con el ánimo de ahorrar, ha aparecido la codificación UTF-8 que convierte la codificación Unicode en "codificación de longitud variable". La codificación UTF-8 codifica un carácter Unicode en 1 a 6 bytes según los diferentes tamaños de números. Las letras inglesas de uso común se codifican en 1 byte y los caracteres chinos suelen tener 3 bytes. Solo se codificarán caracteres muy raros. Codificado en 4-6 bytes.

3. Interpretación de los motivos de los caracteres confusos.

Para diferentes métodos de codificación, una cosa merece nuestra atención:

  • GB2312, GBK y UTF-8 son compatibles con códigos ASCII. Es decir, cuando codificamos caracteres y números en inglés, no importa qué método de codificación utilicemos, se pueden interpretar correctamente.

Esto también muestra que para un archivo de texto de inglés puro y números, no importa qué codificación usemos, no habrá caracteres confusos.

  • Por lo tanto, la mayoría de los caracteres confusos que encontramos a menudo se deben a los diferentes métodos de codificación de GBK y UTF-8 para chino.

Cuando utilizamos la codificación GBK para guardar un archivo de texto que contiene chino y luego decodificamos el archivo mediante UTF-8, aparecerán caracteres confusos.

De manera similar, cuando usamos la codificación UTF-8 para guardar un archivo de texto que contiene chino y luego decodificamos el archivo a través de GBK, aparecerán caracteres confusos.

El motivo se puede ver claramente a través de un simple código Python:

print('ABC'.encode('ascii'))    # 对'ABC'用ascii编码
print('ABC'.encode('gbk'))
print('ABC'.encode('utf-8'))

# print('你好'.encode('ascii')) 报错,ascii不能编码中文
print('你好'.encode('gbk'))
print('你好'.encode('utf-8'))

La salida es como se muestra en la imagen:

Este código simple muestra claramente que los caracteres en inglés usan la codificación ASCII, la codificación GBK y la codificación UTF-8 de la misma manera, no habrá errores de interpretación y no habrá caracteres confusos. Para los caracteres chinos, un carácter chino en gbk se codifica como dos bytes, mientras que un carácter chino en utf-8 se codifica como tres bytes, y los métodos de codificación de los dos son diferentes. Por lo tanto, al interpretar texto codificado en UTF-8 con GBK o al interpretar texto codificado en GBK con UTF-8, aparecerán caracteres confusos o errores.

4. Suplemento (¿código confuso o error?)

Es posible que cuando utilice una codificación para interpretar el texto de otra codificación en Python, a veces aparezcan caracteres confusos, pero a veces se informará directamente un error. ¿Por qué es esto?

No sé si has pensado en algún problema cuando miras el código anterior. Un carácter chino en gbk se codifica como dos bytes, mientras que un carácter chino en utf-8 se codifica como tres bytes, por lo que si utiliza el método de codificación incorrecto para un carácter chino, definitivamente informará un error.

print('你'.encode('gbk').decode('utf-8'))    # 对'你'用gbk编码,再用utf-8解码
print('你'.encode('utf-8').decode('gbk'))

Estas dos declaraciones informarán un error, y el mensaje de error es el error de decodificación que todo el mundo encuentra a menudo:

primera oracion:

UnicodeDecodeError: el códec 'utf-8' no puede decodificar el byte 0xc4 en la posición 0: byte de continuación no válido

La segunda frase:

UnicodeDecodeError: el códec 'gbk' no puede decodificar el byte 0xa0 en la posición 2: secuencia multibyte incompleta

Un carácter chino informará un error, entonces, ¿qué pasa si tengo dos caracteres chinos?

print('你好'.encode('utf-8').decode('gbk'))    # 对'你好'用gbk编码,再用utf-8解码
print('你好'.encode('gbk').decode('utf-8'))

El resultado es el siguiente:

La primera oración se decodifica en tres caracteres chinos, que es diferente de la inicial, y la segunda oración informa un error. No sé si has encontrado el motivo aquí.

Un carácter chino en utf-8 se codifica como tres bytes, luego dos caracteres chinos se codifican como 6 bytes y un carácter chino en gbk se codifica como dos bytes, por lo que cuando se usa gbk para decodificar, estos 6 bytes se pueden dividir en 3 partes, correspondientes a 3 caracteres chinos.

En la segunda oración, gbk codifica dos caracteres chinos en 4 bytes, pero utf-8 no puede decodificar 4 bytes. Esto también explica el siguiente mensaje de error: secuencia multibyte incompleta (secuencia multibyte incompleta).

De esto, se puede concluir que para una oración en chino, cuando se usa la codificación gbk, si el número total de bytes codificados es un múltiplo entero de 3, se puede decodificar con utf-8, pero el contenido es diferente. Cuando se utiliza la codificación utf-8, si el número total de bytes codificados es un múltiplo entero de 2, se puede decodificar con gbk, pero el contenido es diferente.

Supongo que te gusta

Origin blog.csdn.net/lyb06/article/details/129676450
Recomendado
Clasificación