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