2009-11-19 14 views
7

me sale este error:Python, UnicodeDecodeError

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range(128) 

I intentado fijar muchos códecs diferentes (en la cabecera, como # -*- coding: utf8 -*-), o incluso el uso de u "cadena", pero sigue apareciendo.

¿Cómo puedo solucionar esto?

Editar: No sé el personaje real que está causando esto, pero ya que este es un programa que forma recursiva navega carpetas, debe de haber encontrado un archivo con caracteres extraños en su nombre

Código:

# -*- coding: utf8 -*- 


# by TerabyteST 

########################### 

# Explores given path recursively 
# and finds file which size is bigger than the set treshold 

import sys 
import os 

class Explore(): 
    def __init__(self): 
     self._filelist = [] 

    def exploreRec(self, folder, treshold): 
     print folder 
     generator = os.walk(folder + "/") 
     try: 
      content = generator.next() 
     except: 
      return 
     folders = content[1] 
     files = content[2] 
     for n in folders: 
      if "$" in n: 
       folders.remove(n) 
     for f in folders: 
      self.exploreRec(u"%s/%s"%(folder, f), treshold) 
     for f in files: 
      try: 
       rawsize = os.path.getsize(u"%s/%s"%(folder, f)) 
      except: 
       print "Error reading file %s"%u"%s/%s"%(folder, f) 
       continue 
      mbsize = rawsize/(1024 * 1024.0) 
      if mbsize >= treshold: 
       print "File %s is %d MBs!"%(u"%s/%s"%(folder, f), mbsize) 

error:

Traceback (most recent call last): 
    File "<pyshell#19>", line 1, in <module> 
    a.exploreRec("C:", 100) 
    File "D:/Python/Explorator/shitfinder.py", line 35, in exploreRec 
    print "Error reading file %s"%u"%s/%s"%(folder, f) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range(128) 

Aquí es lo que se muestra usando print repr("Error reading file %s"%u"%s/%s"%(folder.decode('utf-8','ignore'), f.decode('utf-8','ignore')))

>>> a = Explore() 
>>> a.exploreRec("C:", 100) 
File C:/Program Files/Ableton/Live 8.0.4/Resources/DefaultPackages/Live8Library_v8.2.alp is 258 MBs! 
File C:/Program Files/Adobe/Reader 9.0/Setup Files/{AC76BA86-7AD7-1040-7B44-A90000000001}/Data1.cab is 114 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/Art1.bar is 393 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/art2.bar is 396 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/art3.bar is 228 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/Sound/Sound.bar is 273 MBs! 
File C:/ProgramData/Microsoft/Search/Data/Applications/Windows/Windows.edb is 162 MBs! 
REPR: 
u"Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/0/Sito web di Mirror's Edge.lnk" 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/0/Sito web di Mirror's Edge.lnk 
REPR: 
u"Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/1/Contenuti scaricabili di Mirror's Edge.lnk" 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/1/Contenuti scaricabili di Mirror's Edge.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Google Talk/Supporto/Modalitiagnostica di Google Talk.lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Google Talk/Supporto/Modalitiagnostica di Google Talk.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Microsoft SQL Server 2008/Strumenti di configurazione/Segnalazione errori e utilizzo funzionaliti SQL Server.lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Microsoft SQL Server 2008/Strumenti di configurazione/Segnalazione errori e utilizzo funzionaliti SQL Server.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox/Mozilla Firefox (Modalitrovvisoria).lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox/Mozilla Firefox (Modalitrovvisoria).lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox 3.6 Beta 1/Mozilla Firefox 3.6 Beta 1 (Modalitrovvisoria).lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox 3.6 Beta 1/Mozilla Firefox 3.6 Beta 1 (Modalitrovvisoria).lnk 

Traceback (most recent call last): 
    File "<pyshell#21>", line 1, in <module> 
    a.exploreRec("C:", 100) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x99 in position 78: ordinal not in range(128) 
>>> 
+3

¡Sin código, sin ayuda! –

+0

Una trazabilidad completa también ayudaría. – retracile

+0

@John: no es del todo cierto. El comentario "codificación: utf-8" al principio determina qué codificación de archivo fuente python espera. –

Respuesta

13

No podemos adivinar lo que está tratando de hacer, ni lo que hay en su código, no lo que "el establecimiento de muchos diferentes codecs "significa, ni lo que se supone que" cadena "debe hacer por usted.

Cambie su código a su estado inicial para que refleje lo mejor que pueda lo que intenta hacer, ejecútelo de nuevo y luego edite su pregunta para proporcionar (1) el rastreo completo y el mensaje de error que obtiene (2) fragmento que abarca la última declaración en su script que aparece en traceback (3) una breve descripción de lo que quiere que haga el código (4) qué versión de Python está ejecutando.

Edición después de detalles añadidos a la pregunta:

(0) Vamos a tratar algunas transformaciones en la sentencia anómala:

original:
print "Error reading file %s"%u"%s/%s"%(folder, f)
añadir espacios para la ilegibilidad reducida:
print "Error reading file %s" % u"%s/%s" % (folder, f)
Agregar paréntesis para enfatizar la orden de evaluación:
print ("Error reading file %s" % u"%s/%s") % (folder, f)
evaluar la expresión (constante) entre paréntesis:
print u"Error reading file %s/%s" % (folder, f)

¿Es eso realmente lo que pretende? Sugerencia: construya el camino UNA VEZ, usando un método mejor (vea el punto (2) a continuación).

(1) En general, use repr(foo) o "%r" % foo para el diagnóstico. De esta forma, es menos probable que su código de diagnóstico cause una excepción (como está sucediendo aquí) Y usted evita la ambigüedad. Inserte la instrucción print repr(folder), repr(f) antes de intentar obtener el tamaño, volver a ejecutar e informar de nuevo.

(2) No hacer caminos por u"%s/%s" % (folder, filename) ... utilizar os.path.join(folder, filename)

(3) No tienen exceptúa desnudas, comprobar si hay problemas conocidos. Por lo que los problemas desconocidos no siguen siendo desconocidos, hacer algo como esto:

try: 
    some_code() 
except ReasonForBaleOutError: 
    continue 
except: 
    # something's gone wrong, so get diagnostic info 
    print repr(interesting_datum_1), repr(interesting_datum_2) 
    # ... and get traceback and error message 
    raise 

Una forma más sofisticada implicaría la tala en lugar de imprimir, pero lo anterior es mucho mejor que no saber lo que está pasando.

más ediciones después de RTM ("os.walk"), recordando viejas leyendas, y volver a la lectura de su código:

(4) os.walk() camina sobre todo el árbol; no es necesario que lo llame de forma recursiva.

(5) Si pasa una cadena Unicode a os.walk(), los resultados (rutas, nombres de archivo) se informan como unicode. No necesitas todo lo que "bla". Entonces solo tienes que elegir cómo mostrar los resultados de Unicode.

(6) Eliminar rutas con "$" en ellas: debe modificar la lista in situ pero su método es peligroso. Intentar algo como esto:

for i in xrange(len(folders), -1, -1): 
    if '$' in folders[i]: 
     del folders[i] 

(7) Su referencia a archivos uniéndose a un nombre de carpeta y un nombre de archivo. Está utilizando el nombre de la carpeta ORIGINAL; cuando arrancas la recursión, esto no funcionará; necesitarás usar el valor content[0] actualmente descartado informado por os.walk.

(8) Debe encontrarse el uso de algo muy simple como:

for folder, subfolders, filenames in os.walk(unicoded_top_folder): 

No hay necesidad de generator = os.walk(...); try: content = generator.next() etc y por cierto si alguna vez tiene que ver generator.next() en el futuro, utilizar except StopIteration en lugar de un desnudo, excepto .

(9) Si la persona que llama proporciona una carpeta que no existe, no se genera ninguna excepción, simplemente no hace nada. Si la carpeta proporcionada existe, pero está vacía, ídem. Si necesita distinguir entre estos dos escenarios, tendrá que hacer pruebas adicionales usted mismo.

Respuesta a este comentario del OP: "" "Gracias, por favor, lea la información que repr() ha mostrado en la primera publicación. No sé por qué imprimió tantos artículos diferentes, pero parece todos tienen problemas. Y lo común entre todos es que son archivos .ink. ¿Puede ser ese el problema? Además, en los últimos, los de Firefox, imprime (Modalitrovvisoria) mientras que el nombre real del archivo de Explorer contiene (Modalità provvisia) "" "

(10) Umm eso no es" .INK ".lower(), es" .LNK ".lower() ... tal vez necesites cambiar la fuente en lo que sea que estés leyendo eso con.

(11) El hecho de que los nombres de los "problemas" terminen en ".lnk"/puede/tener algo que ver con os.walk() y/o Windows está haciendo algo especial con los nombres de esos archivos.

(12) que repetir aquí la declaración de Python que utilizó para realizar dicho producto, con un poco de espacio en blanco introducido:

print repr(
    "Error reading file %s" \ 
    % u"%s/%s" % (
     folder.decode('utf-8','ignore'), 
     f.decode('utf-8','ignore') 
     ) 
    ) 

Parece que usted no ha leído, o no se entiende, o simplemente ignorado, el consejo que le di en un comentario sobre otra respuesta (y la respuesta del contestador): UTF-8 NO es relevante en el contexto de los nombres de archivo en un sistema de archivos de Windows.

Estamos interesados ​​en exactamente a qué carpeta se refieren f. Has pisoteado toda la evidencia al intentar decodificarla usando UTF-8. Ha agravado la ofuscación usando la opción "ignorar". Si hubiera utilizado la opción "reemplazar", habría visto "(Modalit \ ufffdrovvisoria)". La opción "ignorar" no tiene lugar en la depuración.

En cualquier caso, es sospechoso el hecho de que algunos de los nombres de los archivos tenían algún tipo de error pero aparentaban NO perder caracteres con la opción "ignorar" (o parecía NO haber sido mutilado).

¿Qué parte de "" "Insertar la instrucción print repr(folder), repr(f)" "" no entendiste?Todo lo que necesita hacer es algo como esto:

print "Some meaningful text" # "error reading file" isn't 
print "folder:", repr(folder) 
print "f:", repr(f) 

(13) También parece que ha introducido UTF-8 en otra parte de su código, a juzgar por el rastreo: self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold)

me gustaría señale que aún no sabe si la carpeta yf se refieren a objetos str u objetos unicode, y dos respuestas han sugerido que es muy probable que sean objetos str, entonces, ¿por qué introducir blahbah.encode() ??

Un punto más general: intente comprender cuál es su problema (s), ANTES de cambiar su secuencia de comandos. Agitarse al intentar cada sugerencia junto con una técnica de depuración efectiva cercana a cero no es el camino a seguir.

(14) Cuando vuelva a ejecutar el script, puede reducir el volumen del resultado ejecutándolo sobre un subconjunto de C: \ ... especialmente si continúa con mi sugerencia original de tener la impresión de depuración de TODOS los nombres de archivo, no solo los erróneos (saber qué aspecto tienen los que no son de error podría ayudar a comprender el problema).

Respuesta a la función de Bryan McLemore de "limpiar":

(15) He aquí una sesión interactiva con anotaciones que ilustra lo que realmente sucede con os.walk() y nombres de archivo no ASCII:

C:\junk\terabytest>dir 
[snip] 
Directory of C:\junk\terabytest 

20/11/2009 01:28 PM <DIR>   . 
20/11/2009 01:28 PM <DIR>   .. 
20/11/2009 11:48 AM <DIR>   empty 
20/11/2009 01:26 PM    11 Hašek.txt 
20/11/2009 01:31 PM    1,419 tbyte1.py 
29/12/2007 09:33 AM     9 Ð.txt 
       3 File(s)   1,439 bytes 
[snip] 

C:\junk\terabytest>\python26\python 
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] onwin32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from pprint import pprint as pp 
>>> import os 

os.walk (UNICODE_STRING) -> resultado en unicode objetos

>>> pp(list(os.walk(ur"c:\junk\terabytest"))) 
[(u'c:\\junk\\terabytest', 
    [u'empty'], 
    [u'Ha\u0161ek.txt', u'tbyte1.py', u'\xd0.txt']), 
(u'c:\\junk\\terabytest\\empty', [], [])] 

os.walk (str_string) -> resultado en s tr objetos

>>> pp(list(os.walk(r"c:\junk\terabytest"))) 
[('c:\\junk\\terabytest', 
    ['empty'], 
    ['Ha\x9aek.txt', 'tbyte1.py', '\xd0.txt']), 
('c:\\junk\\terabytest\\empty', [], [])] 

CP1252 es la codificación que cabe esperar para ser utilizado en mi sistema ...

>>> u'\u0161'.encode('cp1252') 
'\x9a' 
>>> 'Ha\x9aek'.decode('cp1252') 
u'Ha\u0161ek' 

decodificar el str con UTF-8 no funciona, como se esperaba

>>> 'Ha\x9aek'.decode('utf8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\python26\lib\encodings\utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x9a in position 2: unexpected code byte 

cadena CUALQUIER aleatoria de bytes puede ser decodificada sin errores mediante latin1

>>> 'Ha\x9aek'.decode('latin1') 
u'Ha\x9aek' 

PERO U + 009A es un personaje de control (INTRODUCTOR DE CARACTER INDIVIDUAL), es decir, galimatías sin sentido; absolutamente nada que ver con la respuesta correcta

>>> unicodedata.name(u'\u0161') 
'LATIN SMALL LETTER S WITH CARON' 
>>> 

(16) Este ejemplo muestra lo que sucede cuando el personaje es representable en el conjunto de caracteres por defecto; ¿Qué pasa si no es así? He aquí un ejemplo (usando IDLE este tiempo) de un nombre de archivo que contiene ideogramas CJK, que definitivamente no son representables en mi juego de caracteres predeterminado:

IDLE 2.6.4  
>>> import os 
>>> from pprint import pprint as pp 

repr (resultados Unicode) se ve bien

>>> pp(list(os.walk(ur"c:\junk\terabytest\chinese"))) 
[(u'c:\\junk\\terabytest\\chinese', [], [u'nihao\u4f60\u597d.txt'])] 

y el Unicode muestra muy bien en IDLE:

>>> print list(os.walk(ur"c:\junk\terabytest\chinese"))[0][2][0] 
nihao你好.txt 

El resultado de str se produce evidentemente al usar.codificar (lo que sea, "reemplazar") - no muy útil, p. no puede abrir el archivo pasando eso como el nombre del archivo.

>>> pp(list(os.walk(r"c:\junk\terabytest\chinese"))) 
[('c:\\junk\\terabytest\\chinese', [], ['nihao??.txt'])] 

Así que la conclusión es que para obtener mejores resultados, uno debe pasar una cadena Unicode a os.walk(), y hacer frente a cualquier problema de visualización.

+0

hecho, ¿cómo es ahora? –

+0

el problema es que la excepción ocurre en la excepción, muy probablemente porque la codificación dentro del intento también plantea la misma excepción, y no sé cómo obtener más información al respecto (como qué personaje está causando esto o dónde está el archivo/carpeta mencionado situado en mi disco duro) –

+0

@terabytest: "no sé cómo obtener más información" ?? ¿Has leído mi respuesta editada especialmente las partes (1) y (3) donde menciona la función 'repr()'? –

1

¿Está ejecutando este programa en un cuadro de Windows cmd.exe? Si es así, intente ejecutarlo en IDLE y vea si obtiene los mismos errores. El cuadro Cmd.exe no hace unicode, solo ascii.

+0

estoy ejecutando esto en IDLE –

2

Está intentando realizar alguna acción (por ejemplo, imprimir) en una cadena Unicode que contenga caracteres que no sean ASCII, y la cadena se está convirtiendo a ascii de forma predeterminada. Necesitará especificar la codificación para representar correctamente la cadena.
Ayudaría de manera significativa, si publica algún código de muestra de lo que está tratando de hacer.

La forma más sencilla de hacer esto sería:
s = u'ma\xf1ana';
print s.encode('latin-1');

Editado después de detalles añadidos a la pregunta:

En el caso de que necesite para decodificar la cadena que primero lea:
f.decode();,
intente cambiar
u"%s/%s" % (folder, f)
a
os.path.join(folder, f.decode())

Tenga en cuenta, que la codificación 'latino-1' podría ser necesaria para cambiar a lo que su archivo se llama con

PS: John Machin ha mencionado maneras muy útiles para mejorar y limpiar el código. +1

+0

sí, estoy tratando de imprimir la cadena. ¿Cómo le digo que no use ascii? –

+0

El ejemplo más simple sería el siguiente: s = u'ma \ xf1ana ';
print s.encode ('latin-1') – artdanil

+0

no se puede obtener un comentario para mostrar el código de muestra correctamente, así que lo puse en la respuesta. – artdanil

1
u"%s" % f 

En varios lugares está haciendo algo similar al código anterior. Esta es exactamente la forma incorrecta de convertir un objeto str en un objeto Unicode, ya que la conversión se realiza usando sys.getdefaultencoding() (ascii), que casi está garantizado que es incorrecto.

Debe utilizar los métodos de codificación/decodificación para convertir a/desde un objeto Unicode. Esto requiere saber qué codificación es su entrada (las cadenas devueltas desde os.walk). Por ejemplo, si los nombres de archivo se codifican en UTF-8

uf = f.decode('utf-8') 

interpretará f como una secuencia codificada UTF-8 de bytes y devolver el objeto Unicode adecuada. De manera similar, cuando necesite dar salida al objeto Unicode, lo volverá a convertir a str, especificando la codificación válida con la que desea generarla.

print uf.encode('utf-8') 
+0

Todavía obtengo el mismo UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0x99 en la posición 125: el ordinal no está en rango (128) aunque escribí imprimir "Error al leer el archivo% s"% ("% s /% s" % (carpeta, f)). decode ("utf-8") ... Wth –

+0

El tema trata sobre las rutas de archivos de Windows, por lo que utf8 es tan relevante como latin1. –

+0

Mi publicación fue antes de que agregara esa información y tenía la intención de ser información genérica que explicara los problemas con el enfoque utilizado. Comprender esos problemas ayuda, independientemente de la codificación real que se utilice. Lamentablemente, mi publicación fue tomada al pie de la letra en lugar de como una descripción general. – jamessan

-1

en lugar de hacerlo:

print "Error reading file %s"%u"%s/%s"%(folder, f) 

Prueba esto:

print "Error reading file %s"%u"%s/%s"%(folder.encode('ascii','ignore'), f.encode('ascii','ignore')) 

Desde la consola no puede imprimir caracteres Unicode, puede de ver el nombre correcto. 'ignorar' le dice al códec que saltee esos caracteres. también puede usar 'reemplazar' (imprime un '?'), 'xmlcharrefreplace' (reemplaza con & x #### del punto de código), 'backslashreplace' (reemplaza con \ x ###### del código)

Deberá codificar cada cadena Unicode como esta que imprima.

+0

Todavía estoy obteniendo este UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0x99 en la posición 25: ordinal no está dentro del rango (128) es un misterio –

+0

¿Codificó 'u' también? No me di cuenta de que – Knio

+0

Y el uso de "ignorar" le va a permitir ver el "nombre correcto" ??? –

0

He tenido la mala suerte de trabajar en algunas bases de código que no eran coherentes con su codificación.

Esta es una función que usamos para ayudar a limpiar para arriba:

def to_unicode(value): 
    if isinstance(value, unicode): 
     return value 
    elif isinstance(value, str): 
     try: 
      if value.startswith('\xff\xfe'): 
       return value.decode('utf-16-le') 
      elif value.startswith('\xfe\xff'): 
       return value.decode('utf-16-be') 
      else: 
       return value.decode('utf-8') 
     except UnicodeDecodeError: 
      return value.decode('latin-1') 
    else: 
     try: 
      return unicode(value) 
     except UnicodeError: 
      return to_unicode(str(value)) 
     except TypeError: 
      if hasattr(value, '__unicode__'): 
       return value.__unicode__() 

Así, utilizando la función que puede utilizar:

print u"Error reading file %s/%s" % (to_unicode(folder), to_unicode(f)) 
+0

¿Qué te hace pensar que los nombres de directorios y archivos devueltos por os.walk() en Windows no se codificarán de forma coherente? Estos nombres no tendrán listas de materiales UTF-16, por lo que su código probará UTF8, que fallará en cualquier byte que no sea ASCII, y en ese caso devolverá la cadena decodificada utilizando latin1, IOW arrojará basura sin indicación de que haya un problema. Vea mi respuesta actualizada para un ejemplo. –

+1

Si lee más que el bloque de código, verá que no se trata de una función a medida para manejar esta pregunta. Es una función general para unúnico que esperaba que lo ayudara. Su comentario está lejos de ser constructivo y, en su lugar, muy inflamatorio y muy poco recomendable. –

+0

Vi que era una función general para_unicodo.Como expliqué, si el objeto str no está codificado en latin1 o UTF-8 y no comienza con una BOM UTF-16, tu rutina lo decodificará usando latin1, lo cual NO es útil, porque LATIN1 DECODE CUALQUIER SECUENCIA DE BYTES SIN ERROR, su rutina está ocultando el problema. Vea mi ejemplo donde su procedimiento toma una str codificada en cp1252 y devuelve unicode que contiene un caracter de control. Tales resultados son basura sin sentido y debe decirse que son basura sin sentido, tanto para el OP como para su (s) propia (s) aplicación (es). –

6

Python utiliza la codificación ASCII de forma predeterminada, lo cual es molesto. Si desea cambiarlo permanentemente, busque y edite el archivo site.py, busque def setencoding() y pocas líneas a continuación cambien encoding = "ascii" a encoding = "utf-8". Adiós, bye codificación ASCII por defecto.

Cuestiones relacionadas