¿Cómo decodificar un carácter no Unicode en Python?

Tengo una cadena que dice s = 'Chocolate Moelleux-M\xe8re' Cuando estoy haciendo:

 In [14]: unicode(s) --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 20: ordinal not in range(128) 

De manera similar, cuando estoy tratando de descodificar esto usando s.decode() , devuelve el mismo error.

 In [13]: s.decode() --------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 20: ordinal not in range(128) 

Cómo decodificar dicha cadena en Unicode.

He tenido que enfrentar este problema demasiadas veces. El problema que tenía contenía cadenas en diferentes esquemas de encoding. Así que escribí un método para decodificar una cadena heurísticamente en base a ciertas características de diferentes codificaciones.

 def decode_heuristically(string, enc = None, denc = sys.getdefaultencoding()): """ Try to interpret 'string' using several possible encodings. @input : string, encode type. @output: a list [decoded_string, flag_decoded, encoding] """ if isinstance(string, unicode): return string, 0, "utf-8" try: new_string = unicode(string, "ascii") return string, 0, "ascii" except UnicodeError: encodings = ["utf-8","iso-8859-1","cp1252","iso-8859-15"] if denc != "ascii": encodings.insert(0, denc) if enc: encodings.insert(0, enc) for enc in encodings: if (enc in ("iso-8859-15", "iso-8859-1") and re.search(r"[\x80-\x9f]", string) is not None): continue if (enc in ("iso-8859-1", "cp1252") and re.search(r"[\xa4\xa6\xa8\xb4\xb8\xbc-\xbe]", string)\ is not None): continue try: new_string = unicode(string, enc) except UnicodeError: pass else: if new_string.encode(enc) == string: return new_string, 0, enc # If unable to decode,doing force decoding ieneglecting those chars. output = [(unicode(string, enc, "ignore"), enc) for enc in encodings] output = [(len(new_string[0]), new_string) for new_string in output] output.sort() new_string, enc = output[-1][1] return new_string, 1, enc 

Para agregar a esto, este enlace proporciona una buena información sobre por qué codificar, etc. – ¿Por qué necesitamos sys.setdefaultencoging en el script Py?

Usted necesita decirle a su código de encoding. En su caso, el s.decode('latin-1') parece apropiado.