tiene 3 o 4 o 5 problemas ... pero repr()
y unicodedata.name()
son sus amigos; sin ambigüedades le muestran exactamente lo que tiene, sin la confusión engendrada por personas con diferentes codificaciones de consola que comunican los resultados de print fubar
.
Resumen: bien (a) empiezas con un objeto Unicode y aplicas la función de comillas a eso o (b) comienzas con un objeto str y tu consola de codificación no es UTF-8.
Si como usted dice usted comienza con un objeto Unicode:
>>> s0 = u'%C3%A7%C3%B6asd+fjkls%25asd'
>>> print repr(s0)
u'%C3%A7%C3%B6asd+fjkls%25asd'
esto es un disparate accidental. Si aplica urllibX.unquote_YYYY()
, obtendrá otro objeto Unicode sin sentido (u'\xc3\xa7\xc3\xb6asd+fjkls%asd'
) que causaría los síntomas que se muestran cuando se imprima.Debe convertir el objeto Unicode original a un objeto str inmediato:
>>> s1 = s0.encode('ascii')
>>> print repr(s1)
'%C3%A7%C3%B6asd+fjkls%25asd'
entonces debería fin de la cita que:
>>> import urllib2
>>> s2 = urllib2.unquote(s1)
>>> print repr(s2)
'\xc3\xa7\xc3\xb6asd+fjkls%asd'
En cuanto a los primeros 4 bytes de eso, se codifica en UTF-8. Si lo hace print s2
, se verá bien si su consola está esperando UTF-8, pero si está esperando ISO-8859-1 (también conocido como latin1) verá la basura sintomática (el primer carácter será A-tilde). Vamos parque que pensó por un momento y convertirlo en un objeto Unicode:
>>> s3 = s2.decode('utf8')
>>> print repr(s3)
u'\xe7\xf6asd+fjkls%asd'
e inspeccionar para ver lo que realmente tenemos:
>>> import unicodedata
>>> for c in s3[:6]:
... print repr(c), unicodedata.name(c)
...
u'\xe7' LATIN SMALL LETTER C WITH CEDILLA
u'\xf6' LATIN SMALL LETTER O WITH DIAERESIS
u'a' LATIN SMALL LETTER A
u's' LATIN SMALL LETTER S
u'd' LATIN SMALL LETTER D
u'+' PLUS SIGN
Parece que lo que ha dicho que esperaba. Ahora llegamos a la pregunta de mostrarlo en su consola. Nota: no se asuste cuando vea "cp850"; Estoy haciendo esto de manera portátil y estoy haciendo esto en un Símbolo del sistema en Windows.
>>> import sys
>>> sys.stdout.encoding
'cp850'
>>> print s3
çöasd+fjkls%asd
Nota: el objeto Unicode se codificó explícitamente mediante sys.stdout.encoding. Afortunadamente, todos los caracteres Unicode en s3
son representables en esa codificación (y cp1252 y latin1).
Por favor haga un favor a sus ayudantes y publique el resultado de ejecutar 'import sys; print sys.stdout.encoding' –
De hecho, es probable que la descodificación funcione correctamente, pero la reencoding para la pantalla de la consola puede estar teniendo problemas. – ncoghlan