Respuestas:
Las cadenas literales son Unicode por defecto en Python3.
Suponiendo que text
es un bytes
objeto, solo usatext.decode('utf-8')
unicode
de Python2 es equivalente a str
en Python3, por lo que también puede escribir:
str(text, 'utf-8')
si tu prefieres.
str
es unicode, es decir. se "decodifica", por lo que no tiene sentido para llamar decode
en él
str(text, 'utf-8')
, el texto debe ser una cadena binaria. por ejemplostr(b'this is a binary', 'utf-8')
Lo nuevo en Python 3.0 dice:
Todo el texto es Unicode; sin embargo, Unicode codificado se representa como datos binarios
Si desea asegurarse de que está generando utf-8, aquí hay un ejemplo de esta página en unicode en 3.0 :
b'\x80abc'.decode("utf-8", "strict")
Como solución alternativa, he estado usando esto:
# Fix Python 2.x.
try:
UNICODE_EXISTS = bool(type(unicode))
except NameError:
unicode = lambda s: str(s)
try: unicode = str; except: pass
.
unicode = str
ya que no fallará ni en 2 ni en 3
from six import u as unicode
lo que preferiría simplemente porque es más autodocumentado (ya que seis es una capa de compatibilidad de 2/3) queunicode = str
Así solucioné mi problema para convertir caracteres como \ uFE0F, \ u000A, etc. Y también emojis que codificaban con 16 bytes.
example = 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\\uD83D\\uDE0D\\uD83D\\uDE0D\\u2764\\uFE0F Present Moment Caf\\u00E8 in St.Augustine\\u2764\\uFE0F\\u2764\\uFE0F '
import codecs
new_str = codecs.unicode_escape_decode(example)[0]
print(new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\ud83d\ude0d\ud83d\ude0d❤️ Present Moment Cafè in St.Augustine❤️❤️ '
new_new_str = new_str.encode('utf-16', 'surrogatepass').decode('utf-16')
print(new_new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream😍😍❤️ Present Moment Cafè in St.Augustine❤️❤️ '
En un programa de Python 2 que usé durante muchos años había esta línea:
ocd[i].namn=unicode(a[:b], 'utf-8')
Esto no funcionó en Python 3.
Sin embargo, el programa resultó funcionar con:
ocd[i].namn=a[:b]
No recuerdo por qué puse unicode allí en primer lugar, pero creo que fue porque el nombre puede contener letras suecas åäöÅÄÖ. Pero incluso ellos funcionan sin "unicode".
la forma más fácil en Python 3.x
text = "hi , I'm text"
text.encode('utf-8')