bytes - unicode escape python
Uso de las funciones unicode() y encode() en Python (3)
Tengo un problema con la codificación de la variable de ruta y su inserción en la base de datos SQLite . Traté de resolverlo con la función de codificación ("utf-8") que no ayudó. Luego usé la función Unicode () que me da el tipo de Unicode .
print type(path) # <type ''unicode''>
path = path.replace("one", "two") # <type ''str''>
path = path.encode("utf-8") # <type ''str''> strange
path = unicode(path) # <type ''unicode''>
Finalmente gané el tipo Unicode , pero todavía tengo el mismo error que estaba presente cuando el tipo de la variable de ruta era str
sqlite3.ProgrammingError: no debe usar cadenas de bytes de 8 bits a menos que use text_factory que pueda interpretar cadenas de bytes de 8 bits (como text_factory = str). Es muy recomendable que simplemente cambie su aplicación a cadenas Unicode.
¿Podría ayudarme a resolver este error y explicar el uso correcto de unicode()
funciones de encode("utf-8")
y de unicode()
? A menudo peleo con eso.
EDITAR:
Esta instrucción execute () generó el error:
cur.execute("update docs set path = :fullFilePath where path = :path", locals())
Olvidé cambiar la codificación de la variable fullFilePath que sufre el mismo problema, pero ahora estoy bastante confundido. ¿Debo usar solo unicode () o codificar ("utf-8") o ambos?
No puedo usar
fullFilePath = unicode(fullFilePath.encode("utf-8"))
porque plantea este error:
UnicodeDecodeError: el códec ''ascii'' no puede decodificar el byte 0xc5 en la posición 32: ordinal no en el rango (128)
La versión de Python es 2.7.2
Asegúrate de haber configurado correctamente tu configuración regional antes de ejecutar el script desde el shell, por ejemplo
$ locale -a | grep "^en_./+UTF-8"
en_GB.UTF-8
en_US.UTF-8
$ export LC_ALL=en_GB.UTF-8
$ export LANG=en_GB.UTF-8
Documentos: man locale
, man locale
, man setlocale
, man setlocale
.
Está utilizando la encode("utf-8")
incorrectamente. Las cadenas de bytes de Python (tipo str
) tienen una codificación, Unicode no. Puede convertir una cadena Unicode en una cadena de bytes Python usando uni.encode(encoding)
, y puede convertir una cadena de bytes en una cadena Unicode usando s.decode(encoding)
(o equivalente, unicode(s, encoding)
).
Si fullFilePath
y path
son actualmente un tipo str
, deberías averiguar cómo están codificados. Por ejemplo, si la codificación actual es utf-8, usaría:
path = path.decode(''utf-8'')
fullFilePath = fullFilePath.decode(''utf-8'')
Si esto no lo soluciona, el problema real puede ser que no está utilizando una cadena Unicode en su llamada a execute()
, intente cambiarlo a lo siguiente:
cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
str
es representación de texto en bytes, unicode
es representación de texto en caracteres.
Decodifica texto de bytes a unicode y codifica un unicode en bytes con alguna codificación.
Es decir:
>>> ''abc''.decode(''utf-8'') # str to unicode
u''abc''
>>> u''abc''.encode(''utf-8'') # unicode to str
''abc''