Problemas de encoding / deencoding de Python

¿Cómo decodificar cadenas como esta “weren \ xe2 \ x80 \ x99t” para volver a la encoding normal?

¿Entonces esta palabra en realidad no era y no era “weren \ xe2 \ x80 \ x99t”? Por ejemplo:

print "\xe2\x80\x9cThings" string = "\xe2\x80\x9cThings" print string.decode('utf-8') print string.encode('ascii', 'ignore') “Things “Things Things 

Pero en realidad quiero conseguir “Cosas.

o:

 print "weren\xe2\x80\x99t" string = "weren\xe2\x80\x99t" print string.decode('utf-8') print string.encode('ascii', 'ignore') weren’t weren't werent 

Pero en realidad quiero conseguir que no fueran.

Cómo debería hacer esto?

Asigné los caracteres extraños más comunes, así que esta es una respuesta bastante completa basada en la respuesta de Oliver W.

Esta función no es ideal, pero es el mejor lugar para comenzar. Hay más definiciones de caracteres:

http://utf8-chartable.de/unicode-utf8-table.pl?start=8192&number=128&utf8=string
http://www.utf8-chartable.de/unicode-utf8-table.pl?start=128&number=128&names=-&utf8=string-literal

 def unicodetoascii(text): uni2ascii = { ord('\xe2\x80\x99'.decode('utf-8')): ord("'"), ord('\xe2\x80\x9c'.decode('utf-8')): ord('"'), ord('\xe2\x80\x9d'.decode('utf-8')): ord('"'), ord('\xe2\x80\x9e'.decode('utf-8')): ord('"'), ord('\xe2\x80\x9f'.decode('utf-8')): ord('"'), ord('\xc3\xa9'.decode('utf-8')): ord('e'), ord('\xe2\x80\x9c'.decode('utf-8')): ord('"'), ord('\xe2\x80\x93'.decode('utf-8')): ord('-'), ord('\xe2\x80\x92'.decode('utf-8')): ord('-'), ord('\xe2\x80\x94'.decode('utf-8')): ord('-'), ord('\xe2\x80\x94'.decode('utf-8')): ord('-'), ord('\xe2\x80\x98'.decode('utf-8')): ord("'"), ord('\xe2\x80\x9b'.decode('utf-8')): ord("'"), ord('\xe2\x80\x90'.decode('utf-8')): ord('-'), ord('\xe2\x80\x91'.decode('utf-8')): ord('-'), ord('\xe2\x80\xb2'.decode('utf-8')): ord("'"), ord('\xe2\x80\xb3'.decode('utf-8')): ord("'"), ord('\xe2\x80\xb4'.decode('utf-8')): ord("'"), ord('\xe2\x80\xb5'.decode('utf-8')): ord("'"), ord('\xe2\x80\xb6'.decode('utf-8')): ord("'"), ord('\xe2\x80\xb7'.decode('utf-8')): ord("'"), ord('\xe2\x81\xba'.decode('utf-8')): ord("+"), ord('\xe2\x81\xbb'.decode('utf-8')): ord("-"), ord('\xe2\x81\xbc'.decode('utf-8')): ord("="), ord('\xe2\x81\xbd'.decode('utf-8')): ord("("), ord('\xe2\x81\xbe'.decode('utf-8')): ord(")"), } return text.decode('utf-8').translate(uni2ascii).encode('ascii') print unicodetoascii("weren\xe2\x80\x99t") 

Debe proporcionar un mapa de traducción que asigne caracteres Unicode a otros caracteres Unicode (este último debe estar dentro del rango ASCII si desea volver a codificarlo):

 uni2ascii = {ord('\xe2\x80\x99'.decode('utf-8')): ord("'")} yourstring.decode('utf-8').translate(uni2ascii).encode('ascii') print(yourstring) # prints: "weren't"