[pyar] Codecs, UTF-8

Alejandro Santos listas en alejolp.com
Mie Oct 13 13:13:24 ART 2010


2010/10/12 Martin Cerdeira <martincerdeira en gmail.com>:
>
> Este es el trace completo del error actual:
>
> E:\HOME\Python\Qt\Html>main.py
> Traceback (most recent call last):
>  File "E:\HOME\Python\Qt\Html\main.py", line 22, in on_FileOpen_triggered
>    self.web.setHtml(codecs.open(fname, "r", "utf-8" ).read())
>  File "C:\Python26\lib\codecs.py", line 865, in open
>    file = __builtin__.open(filename, mode, buffering)
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xf3 in position 24: ordinal
>  not in range(128)
>
> Ahora, a raiz de que me dijiste que era imposible que diera el error
> con el open, me puse a ver otras cosas y, noté algo que no había
> notado. El path al archivo tiene un tilde. Es decir:
>
> fname = QtGui.QFileDialog.getOpenFileName(self, filter="*.html")
> print fname
>
> Falla si la carpeta se llama, por ejemplo, "Computación"
>
> No entiendo exactamente por qué falla, ya que le estoy poniendo que es
> utf-8. A lo sumo, fname debería tener la palabra computación con un
> caracter raro en vez de la ó. O, eso es lo que esperaría, pero no.
>

Falla porque el nombre de archivo esta en un encoding que Python no
puede entender. No importa el encoding que le digas al modulo codecs,
el fallo está _antes_ de que se tenga en cuenta ese parametro.

Por un lado, en Windows el encoding por defecto de IDLE es:

# -*- coding: cp1252 -*-

Por el otro, para poder manejar correctamente nombres de archivos con
acentos tenes que usar sys.getfilesystemencoding():

http://docs.python.org/library/sys.html#sys.getfilesystemencoding

Por ejemplo:

import codecs, sys
archivo = u"c:/á.txt"
print codecs.open(archivo.encode(sys.getfilesystemencoding()), 'r', 'utf-8')

Suponiendo que "archivo" es un string Unicode, deberia funcionar.

-- 
Alejandro Santos
http://alejolp.com.ar



More information about the pyar mailing list