Error de codificación de texto en CGI

Oswaldo Hernández listas en soft-com.es
Mar Oct 20 17:29:58 CEST 2009


Chema Cortes escribió:
> El día 20 de octubre de 2009 10:04, Oswaldo Hernández
> <listas en soft-com.es> escribió:
>> Chema Cortes escribió:
>>> El Lunes, 19 de Octubre de 2009 21:49:43 Oswaldo Hernández escribió:
>>>> prueba:
>>>>        print("Línea con tilde".encode("utf-8"))
>>> En python3 ya no vale esta solución. El método .encode() pasa de texto a
>>> secuencia de bytes, con lo que print() usará la "representación" para
>>> visualizar el objeto (en este caso b'L\xc3\xadnea con tilde' )
>>>
>> No entiendo porque no.
>>
>> El problema viene porque le esta enviando codificación unicode al
>> apache/mod_python, y como ya se ha comentado en otras ocasiones unicode no
>> es utf-8.
>>
>> El que en python3 se sustituyan los str por secuencias de bytes no veo
>> porque tiene que afectar, ya que al fin y al cabo un string es eso, una
>> secuencia de bytes.
> 
> En python3 han cambiado un poco las cosas (pienso que para mejor). Las
> secuencias de bytes son de un tipo diferente ('bytes') que no tiene
> conversión implícita a 'str'. El print(), como no tiene cómo convertir
> 'bytes' a 'str', usa su representación, en este caso es b'...' con los
> escapes adecuados.

Con unicode, string, o secuencia de bytes, al final lo que recibe el apache es una cadena de bytes y 
este la interpreta según el encode especificado en la cabecera.

En el ejemplo que ponia antes tambien funciona si en vez de un str envio un buffer o un array con el 
contenido del texto:

	buf = buffer("L\xc3\xadnea con acento u e\xc3\xb1es <br>")
	req.write(buf)
	
	a = array.array('c')
	a.append('L')
	a.append("\xc3")
	a.append("\xad")
	a.append("n")	
	req.write(a)

En php tambien pasa lo mismo. En este codigo php la primera linea no muestra el texto correctamente 
porque el apache espera que sea utf-8, sin embargo la segunda si lo muestra bien:

<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<body>
<?php
	echo "test encode:á é ñ <br>";
	echo utf8_encode("test encode:á é ñ <br>");
?>
</body>
</html>


Saludos,
-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es