Python | Strings C de codificación dudosa | Conjunto-2

El manejo de strings en los módulos de extensión es un problema. Las strings C en las extensiones pueden no seguir las estrictas reglas de codificación/descodificación de Unicode que normalmente espera Python. Por lo tanto, es posible que algunos datos C malformados pasen a Python. Un buen ejemplo podría ser strings C asociadas con llamadas al sistema de bajo nivel, como nombres de archivos. Por ejemplo, qué sucede si una llamada al sistema devuelve una string rota al intérprete que no se puede decodificar correctamente.

Normalmente, los errores de Unicode a menudo se manejan especificando algún tipo de política de error, como estricta, ignorar, reemplazar o algo similar. Sin embargo, la desventaja de estas políticas es que destruyen irremediablemente el contenido de la string original.
Por ejemplo, si los datos con formato incorrecto en el ejemplo se decodificaron utilizando una de estas políticas, obtendría los resultados que se muestran a continuación:

Código #1:

raw = b'Spicy Jalape\xc3\xb1o\xae'
  
print (raw.decode('utf-8', 'ignore'))
  
print (raw.decode('utf-8', 'replace'))

Producción :

'Spicy Jalapeño'
'Spicy Jalapeño?'

Las políticas de manejo de errores de escape suplente toman todos los bytes no decodificables y los convierten en la mitad inferior de un par suplente (\udcXX donde XX es el valor de byte sin procesar).

Código #2:

print (raw.decode('utf-8', 'surrogateescape'))

Producción :

'Spicy Jalapeño\udcae'

Los caracteres sustitutos bajos aislados, como \udcae, nunca aparecen en Unicode válido. Por lo tanto, esta string es técnicamente una representación ilegal. De hecho, si uno intenta pasarlo a funciones que realizan la salida, aparecerán errores de codificación.

Código #3:

s = raw.decode('utf-8', 'surrogateescape')
print(s)

Producción :

Traceback (most recent call last):
File "", line 1, in 
UnicodeEncodeError: 'utf-8' codec can't encode 
character '\udcae' in position 14: surrogates not allowed

Sin embargo, el punto principal de permitir los escapes sustitutos es permitir que las strings con formato incorrecto pasen de C a Python y de regreso a C sin pérdida de datos. Cuando la string se codifica utilizando de nuevo Surrogateescape, los caracteres sustitutos se vuelven a convertir en sus bytes originales. Por ejemplo:

Código #4:

print (s)
print(s.encode('utf-8', 'surrogateescape'))

Producción :

'Spicy Jalapeño\udcae'
b'Spicy Jalape\xc3\xb1o\xae'

Como regla general, probablemente sea mejor evitar la codificación sustituta siempre que sea posible. El código será mucho más fiable si utiliza codificaciones adecuadas. Sin embargo, a veces hay situaciones en las que uno simplemente no tiene control sobre la codificación de datos y no es libre de ignorar o reemplazar los datos incorrectos porque otras funciones pueden necesitar usarlos.

Como nota final, muchas de las funciones orientadas al sistema de Python, especialmente aquellas relacionadas con nombres de archivo, variables de entorno y opciones de línea de comandos, usan codificación sustituta. Por ejemplo, si una función como os.listdir()se usa en un directorio que contiene un nombre de archivo no decodificable, se devolverá como una string con escapes sustitutos.

Publicación traducida automáticamente

Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *