Codificación de Caracteres en Python

PythonPythonBeginner
Practicar Ahora

Introducción

En este laboratorio, obtendrás una comprensión integral de la codificación de caracteres en Python. Comenzaremos explorando la historia y los conceptos fundamentales de la codificación de caracteres, desde las limitaciones de las primeras codificaciones como ASCII y las codificaciones ANSI específicas de cada país hasta el desarrollo y la importancia del estándar Unicode y sus diversas implementaciones como UTF-8. Aprenderás a verificar la codificación predeterminada en tu entorno Python.

Basándote en esta base, aprenderás técnicas prácticas para trabajar con la codificación de caracteres en Python. Esto incluye el uso de las funciones ord() y chr() para convertir entre caracteres y sus representaciones enteras, y el dominio de los métodos encode() y decode() para convertir entre cadenas (strings) y bytes. Finalmente, aprenderás a manejar eficazmente los posibles errores de codificación que puedan surgir durante el proceso de decodificación, garantizando un procesamiento de texto robusto y fiable en tus aplicaciones Python.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 88%. Ha recibido una tasa de reseñas positivas del 98% por parte de los estudiantes.

Explorar la historia y los conceptos de la codificación de caracteres

En este paso, exploraremos la historia y los conceptos fundamentales de la codificación de caracteres. Comprender cómo las computadoras representan el texto es crucial para trabajar con diversos formatos de datos e idiomas.

Inicialmente, las computadoras se desarrollaron en los Estados Unidos, lo que llevó a la creación de la codificación ASCII. ASCII utiliza un solo byte para representar caracteres e incluye letras inglesas, números y símbolos, sumando 128 caracteres.

A medida que las computadoras se volvieron más extendidas a nivel mundial, ASCII demostró ser insuficiente para representar caracteres de otros idiomas. Esto llevó al desarrollo de varias codificaciones específicas de cada país, como GB2312, GBK, Big5 y Shift_JIS. A estas se las refería a menudo colectivamente como codificaciones ANSI.

Para abordar las limitaciones de estas codificaciones dispares, se desarrolló el estándar Unicode. Unicode tiene como objetivo proporcionar un código binario único para cada carácter en cada idioma, permitiendo un manejo de texto consistente en diferentes plataformas e idiomas. Unicode define los códigos de caracteres pero no cómo se almacenan.

Varios esquemas de codificación implementan Unicode, incluyendo UCS4, UTF-8, UTF-16 y UTF-32. Entre estos, UTF-8 es ampliamente utilizado debido a su compatibilidad retroactiva con ASCII.

En Python 3, la codificación predeterminada es UTF-8, lo que permite el uso directo de caracteres de varios idiomas, incluyendo caracteres acentuados y símbolos. En versiones anteriores como Python 2, normalmente necesitarías especificar la codificación al principio de tu script usando comentarios como ## -*- coding: UTF-8 -*- o ## coding=utf-8.

Puedes verificar la codificación predeterminada en tu entorno Python utilizando el módulo sys.

Primero, abre la terminal integrada en la WebIDE haciendo clic en Terminal -> New Terminal.

Luego, inicia el intérprete interactivo de Python escribiendo python y presionando Enter.

python

Deberías ver una salida similar a esta:

Python 3.10.x (main, ...)
[GCC ...] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

Ahora, importa el módulo sys y verifica la codificación predeterminada:

import sys
sys.getdefaultencoding()

La salida mostrará la codificación predeterminada, que típicamente es utf-8 en Python 3.

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>

Sal del intérprete de Python escribiendo exit() y presionando Enter.

exit()

Usar ord() y chr() para convertir caracteres y enteros

En este paso, aprenderemos a usar las funciones integradas de Python ord() y chr() para convertir entre caracteres y sus representaciones enteras correspondientes en Unicode.

En Python 3, las cadenas (strings) se representan utilizando Unicode. La función ord() toma un solo carácter como entrada y devuelve su valor entero decimal Unicode correspondiente.

Creemos un nuevo archivo Python para experimentar con estas funciones. En la WebIDE, haz clic derecho en el directorio project en el explorador de archivos y selecciona New File. Nombra el archivo char_conversion.py.

Abre char_conversion.py en el editor y añade el siguiente código:

## Use ord() to get the Unicode decimal value of characters
char1 = 'a'
char2 = 'é'
char3 = ';'

print(f"The Unicode decimal value of '{char1}' is: {ord(char1)}")
print(f"The Unicode decimal value of '{char2}' is: {ord(char2)}")
print(f"The Unicode decimal value of '{char3}' is: {ord(char3)}")

Guarda el archivo presionando Ctrl + S (o Cmd + S en macOS).

Ahora, abre la terminal integrada nuevamente (si no está abierta) y ejecuta el script usando el comando python:

python char_conversion.py

Deberías ver una salida similar a esta:

The Unicode decimal value of 'a' is: 97
The Unicode decimal value of 'é' is: 233
The Unicode decimal value of ';' is: 59

La función chr() realiza la operación inversa. Toma un entero decimal (o un entero hexadecimal) que representa un punto de código Unicode y devuelve el carácter correspondiente.

Agreguemos más código a char_conversion.py para usar la función chr(). Añade las siguientes líneas al código existente:

## Use chr() to get the character from a Unicode decimal value
int1 = 8364
int2 = 8482

print(f"The character for Unicode decimal value {int1} is: {chr(int1)}")
print(f"The character for Unicode decimal value {int2} is: {chr(int2)}")

## You can also use hexadecimal values with chr()
hex_int = 0x00A9 ## Hexadecimal for the character '©'
print(f"The character for Unicode hexadecimal value {hex(hex_int)} is: {chr(hex_int)}")

Guarda el archivo nuevamente.

Ejecuta el script desde la terminal:

python char_conversion.py

La salida ahora debería incluir los resultados de la función chr():

The Unicode decimal value of 'a' is: 97
The Unicode decimal value of 'é' is: 233
The Unicode decimal value of ';' is: 59
The character for Unicode decimal value 8364 is: €
The character for Unicode decimal value 8482 is: ™
The character for Unicode hexadecimal value 0xa9 is: ©

Quizás te preguntes cómo encontrar la representación hexadecimal Unicode de un carácter. Puedes usar la función ord() para obtener el valor decimal y luego la función integrada hex() para convertir el valor decimal a su representación de cadena hexadecimal.

Añade el siguiente código a char_conversion.py:

## Convert a character to its hexadecimal Unicode representation
char_copyright = '©'
decimal_copyright = ord(char_copyright)
hexadecimal_copyright = hex(decimal_copyright)

print(f"The hexadecimal Unicode value of '{char_copyright}' is: {hexadecimal_copyright}")

Guarda el archivo y ejecútalo una última vez:

python char_conversion.py

La salida final incluirá el valor hexadecimal para el carácter '©':

The Unicode decimal value of 'a' is: 97
The Unicode decimal value of 'é' is: 233
The Unicode decimal value of ';' is: 59
The character for Unicode decimal value 8364 is: €
The character for Unicode decimal value 8482 is: ™
The character for Unicode hexadecimal value 0xa9 is: ©
The hexadecimal Unicode value of '©' is: 0xa9

Esto demuestra cómo ord(), chr() y hex() se pueden usar juntas para trabajar con codificaciones de caracteres en Python.

Convertir entre cadenas y bytes con encode() y decode()

En este paso, aprenderemos a convertir entre cadenas de Python (que son Unicode) y objetos de bytes utilizando los métodos encode() y decode(). Esto es esencial cuando se trabaja con datos que necesitan ser transmitidos o almacenados en un formato de codificación específico.

El método encode() se utiliza para convertir una cadena en un objeto de bytes utilizando una codificación especificada. Devuelve un objeto bytes.

Creemos un nuevo archivo Python llamado encoding_decoding.py en el directorio ~/project.

Abre encoding_decoding.py en el editor y añade el siguiente código:

## Define a string
my_string = 'café'

## Encode the string using UTF-8
encoded_utf8 = my_string.encode('utf-8')

## Encode the string using Latin-1
encoded_latin1 = my_string.encode('latin-1')

## Print the encoded bytes objects
print(f"Original string: {my_string}")
print(f"Encoded in UTF-8: {encoded_utf8}")
print(f"Encoded in Latin-1: {encoded_latin1}")

Guarda el archivo.

Ahora, ejecuta el script desde la terminal integrada:

python encoding_decoding.py

Deberías ver una salida que muestra la cadena original y su representación en bytes tanto en UTF-8 como en Latin-1:

Original string: café
Encoded in UTF-8: b'caf\xc3\xa9'
Encoded in Latin-1: b'caf\xe9'

Observa que la salida de los objetos de bytes comienza con b', lo que indica que son literales de bytes. Los números hexadecimales representan las secuencias de bytes de la cadena en cada codificación.

El método decode() se utiliza para convertir un objeto de bytes de nuevo a una cadena utilizando una codificación especificada.

Agreguemos código a encoding_decoding.py para decodificar los objetos de bytes que creamos. Añade las siguientes líneas al código existente:

## Decode the bytes objects back into strings
decoded_utf8 = encoded_utf8.decode('utf-8')
decoded_latin1 = encoded_latin1.decode('latin-1')

## Print the decoded strings
print(f"Decoded from UTF-8: {decoded_utf8}")
print(f"Decoded from Latin-1: {decoded_latin1}")

Guarda el archivo.

Ejecuta el script de nuevo:

python encoding_decoding.py

La salida ahora mostrará la cadena original decodificada correctamente tanto de los bytes UTF-8 como de los Latin-1:

Original string: café
Encoded in UTF-8: b'caf\xc3\xa9'
Encoded in Latin-1: b'caf\xe9'
Decoded from UTF-8: café
Decoded from Latin-1: café

Esto demuestra el proceso básico de codificar una cadena en bytes y decodificar bytes de nuevo en una cadena utilizando codificaciones específicas. Es crucial usar la codificación correcta tanto para codificar como para decodificar para evitar errores, lo cual exploraremos en el siguiente paso.

Manejar errores de codificación durante la decodificación

En este paso, exploraremos qué sucede cuando intentas decodificar bytes utilizando la codificación incorrecta y cómo manejar dichos errores.

Como vimos en el paso anterior, para decodificar bytes con éxito es necesario conocer la codificación original utilizada para crear esos bytes. Si intentas decodificar bytes con una codificación incompatible, Python generará un error.

Modifiquemos nuestro archivo encoding_decoding.py para demostrar esto. Abre el archivo en el editor y añade el siguiente código al final:

## Attempt to decode Latin-1 encoded bytes using ASCII
try:
    decoded_incorrectly = encoded_latin1.decode('ascii')
    print(f"Decoded from Latin-1 using ASCII: {decoded_incorrectly}")
except UnicodeDecodeError as e:
    print(f"Error decoding Latin-1 with ASCII: {e}")

Guarda el archivo.

Ejecuta el script desde la terminal:

python encoding_decoding.py

La salida ahora incluirá el mensaje de error al intentar decodificar bytes Latin-1 con ASCII:

Original string: café
Encoded in UTF-8: b'caf\xc3\xa9'
Encoded in Latin-1: b'caf\xe9'
Decoded from UTF-8: café
Decoded from Latin-1: café
Error decoding Latin-1 with ASCII: 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)

El UnicodeDecodeError indica que el códec ASCII encontró bytes que no son válidos según el estándar ASCII. En este caso, el byte 0xe9 es la representación Latin-1 de 'é', pero no es un carácter ASCII válido (ASCII solo cubre los caracteres del 0 al 127).

Al decodificar, también puedes especificar cómo manejar los errores utilizando el parámetro errors del método decode(). Las estrategias comunes de manejo de errores incluyen:

  • 'strict' (predeterminado): Genera un UnicodeDecodeError.
  • 'ignore': Ignora los bytes que no se pueden decodificar.
  • 'replace': Reemplaza los bytes que no se pueden decodificar con un carácter de reemplazo (generalmente ``).
  • 'xmlcharrefreplace': Reemplaza los bytes que no se pueden decodificar con referencias de caracteres XML.

Agreguemos ejemplos de uso de las estrategias de manejo de errores 'ignore' y 'replace' a encoding_decoding.py. Añade el siguiente código:

## Attempt to decode Latin-1 encoded bytes using ASCII with error handling
decoded_ignore = encoded_latin1.decode('ascii', errors='ignore')
decoded_replace = encoded_latin1.decode('ascii', errors='replace')

print(f"Decoded from Latin-1 using ASCII (ignore errors): {decoded_ignore}")
print(f"Decoded from Latin-1 using ASCII (replace errors): {decoded_replace}")

Guarda el archivo.

Ejecuta el script de nuevo:

python encoding_decoding.py

La salida ahora mostrará los resultados con el manejo de errores:

Original string: café
Encoded in UTF-8: b'caf\xc3\xa9'
Encoded in Latin-1: b'caf\xe9'
Decoded from UTF-8: café
Decoded from Latin-1: café
Error decoding Latin-1 with ASCII: 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)
Decoded from Latin-1 using ASCII (ignore errors): caf
Decoded from Latin-1 using ASCII (replace errors): caf

Como puedes ver, 'ignore' resulta en "caf" porque el byte inválido fue ignorado, eliminando el carácter 'é'. 'replace' reemplaza el byte inválido con el carácter de reemplazo ``, resultando en "caf".

La elección de la estrategia de manejo de errores apropiada depende de tus necesidades específicas. Para la mayoría de los casos, es mejor usar 'strict' durante el desarrollo para detectar problemas de codificación de manera temprana. En producción, podrías elegir 'replace' o 'ignore' si necesitas procesar datos con posibles problemas de codificación, pero ten en cuenta que esto puede llevar a pérdida o corrupción de datos.

Resumen

En este laboratorio, exploramos la historia y los conceptos fundamentales de la codificación de caracteres, comenzando con ASCII y sus limitaciones, que llevaron al desarrollo de varias codificaciones específicas de cada país y, en última instancia, al estándar Unicode. Aprendimos que Unicode proporciona un código único para cada carácter y se implementa mediante varios esquemas de codificación como UTF-8, que es el predeterminado en Python 3 y es compatible con versiones anteriores de ASCII. También aprendimos cómo verificar la codificación predeterminada en Python utilizando el módulo sys.

Luego practicamos la conversión entre caracteres y sus representaciones enteras utilizando las funciones ord() y chr(), y entre cadenas y bytes utilizando los métodos encode() y decode(). Finalmente, abordamos cómo manejar posibles errores de codificación que pueden ocurrir durante el proceso de decodificación.

Morty Proxy This is a proxified and sanitized view of the page, visit original site.