Técnicas de Codificación y Secuencias de Escape en Python

Los lenguajes de programación utilizan caracteres reservados y palabras clave para definir su sintaxis. Para representar estos caracteres de manera literal o para manejar conjuntos de caracteres especiales durante la transimsión de datos, se emplean secuencias de escape y esquemas de codificación. En Python, la barra invertida (\) actúa como el carácter de escape principal, mientras que módulos específicos facilitan la transformación de datos para distintos protocolos.

Secuencias de Escape Unicode

Las secuencias Unicode, identificadas por el prefijo \u, son extremadamente comunes al procesar respuestas JSON o datos transmitidos a través de HTTP. Esto ocurre porque los sistemas a menudo escapan caracteres no ASCII para garantizar la compatibilidad con el estándar ASCII durante el transporte.

import json

# Simulación de una respuesta con caracteres Unicode escapados
raw_response = '{"ciudad": "\\u5317\\u4eac", "pais": "China"}'
parsed_data = json.loads(raw_response)
print(parsed_data['ciudad']) # Imprime: 北京

# Diferencia entre la representación literal y la cadena escapada
literal_str = "\u5317\u4eac"
escaped_str = "\\u5317\\u4eac"

print(literal_str == escaped_str) # False

Para transformar manualmente una cadena que contiene secuencias de escape Unicode literales a su forma legible, se debe codificar a bytes y luego decodificar utilizando el códec unicode-escape.

# Decodificación de una cadena con secuencias de escape
texto_escapado = "\\u5317\\u4eac"
texto_decodificado = texto_escapado.encode('utf-8').decode('unicode-escape')
print(texto_decodificado) # 北京

# Codificación a formato de escape Unicode
texto_original = "北京"
texto_codificado = texto_original.encode('unicode-escape').decode('utf-8')
print(texto_codificado) # \u5317\u4eac

Codificación GBK y Secuencias Hexadecimales

En sistemas heredados o páginas web antiguas en chino, es frecuente encontrar la codificación GBK. Esta codificación utiliza el prefijo \x para representar bytes individuales en formato hexadecimal.

ciudad = "上海"
bytes_gbk = ciudad.encode('gbk')
print(bytes_gbk) # b'\xc9\xcf\xba\xa3'

Si se recibe la representación en cadena de texto de estos bytes hexadecimales, el proceso de recuperación requiere una cadena de decodificación específica para interpretar correctamente los bytes subyacentes.

cadena_hex = "\\xc9\\xcf\\xba\\xa3"

# Proceso de decodificación paso a paso
ciudad_recuperada = (
    cadena_hex
    .encode('latin1')
    .decode('unicode-escape')
    .encode('latin1')
    .decode('gbk')
)
print(ciudad_recuperada) # 上海

Escape de Caracteres HTML

Al interactuar con la web, es crucial escapar caracteres especiales para prevenir vulnerabilidades de inyección (como XSS) o errores de renderizado en el DOM. El módulo integrado html proporciona funciones directas para esta tarea.

import html

texto_original = 'Datos: "id"=10 & "estado"="activo"'

# Escapar caracteres especiales para HTML
texto_seguro = html.escape(texto_original)
print(texto_seguro)
# Datos: "id"=10 & "estado"="activo"

# Restaurar la cadena a su formato original
texto_restaurado = html.unescape(texto_seguro)
print(texto_restaurado == texto_original) # True

Codificación de URLs

Las URLs solo permiten un conjunto estricto de caracteres ASCII. Los parámetros que contienen espacios, acentos, símbolos o caracteres no latinos deben ser codificados para que los servidores web y los navegadores puedan procesarlos correctamente.

from urllib.parse import quote, unquote, urlencode

# Decodificación de una URL completa
url_codificada = 'https://api.ejemplo.com/buscar?q=ingenier%C3%ADa%20de%20software&pagina=1'
url_legible = unquote(url_codificada)
print(url_legible)
# https://api.ejemplo.com/buscar?q=ingeniería de software&pagina=1

# Codificación de parámetros individuales
parametro = "ingeniería de software"
print(quote(parametro)) # ingenier%C3%ADa%20de%20software

# Codificación de un diccionario de parámetros para construir un query string
parametros_dict = {
    "q": "ingeniería de software",
    "pagina": 1,
    "filtro": "año:2023"
}
query_string = urlencode(parametros_dict)
print(query_string)
# q=ingenier%C3%ADa+de+software&pagina=1&filtro=a%C3%B1o%3A2023

Codificación Base64

A diferencia del cifrado criptográfico, la codificación Base64 está diseñada para trasnportar datos binarios a través de medios que manejan exclusivamente texto, como cuerpos JSON, correos electrónicos o encabezados HTTP. Su propósito es garantizar la compatibilidad y la integridad de los datos durante la transmisión, no proporcionar seguridad.

import base64

mensaje_original = "Arquitectura de Microservicios"
bytes_mensaje = mensaje_original.encode('utf-8')

# Codificación a Base64
base64_bytes = base64.b64encode(bytes_mensaje)
base64_str = base64_bytes.decode('utf-8')
print(base64_str)
# QXJxdWl0ZWN0dXJhIGRlIE1pY3Jvc2VydmljaW9z

# Decodificación desde Base64
decodificado_bytes = base64.b64decode(base64_str)
mensaje_recuperado = decodificado_bytes.decode('utf-8')
print(mensaje_recuperado)
# Arquitectura de Microservicios

Etiquetas: Python Unicode GBK HTML-Encoding URL-Encoding

Publicado el 7-17 12:57