Tengo un problema con la codificación de la variable de ruta y la inserción en la base de datos SQLite . Traté de resolverlo con la función encode ("utf-8") que no ayudó. Luego usé la función unicode () que me da tipo 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 obtuve 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 un text_factory que pueda interpretar cadenas de bytes de 8 bits (como text_factory = str). Se recomienda encarecidamente que, en cambio, cambie su aplicación a cadenas Unicode.
¿Podría ayudarme a solucionar este error y explicar el uso correcto de encode("utf-8")
y unicode()
funciones? A menudo estoy luchando 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 encode ("utf-8") o ambos?
No puedo usar
fullFilePath = unicode(fullFilePath.encode("utf-8"))
porque genera este error:
UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0xc5 en la posición 32: ordinal no está en el rango (128)
La versión de Python es 2.7.2
unicode
?Respuestas:
Está utilizando
encode("utf-8")
incorrectamente. Las cadenas de bytes de Python (str
tipo) tienen una codificación, Unicode no. Puede convertir una cadena Unicode en una cadena de bytes de Python usandouni.encode(encoding)
, y puede convertir una cadena de bytes en una cadena Unicode usandos.decode(encoding)
(o equivalentemente,unicode(s, encoding)
).Si
fullFilePath
ypath
son actualmente unstr
tipo, debería 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é usando una cadena Unicode en su
execute()
llamada, intente cambiarla a lo siguiente:cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
fuente
fullFilePath = fullFilePath.decode("utf-8")
aún genera erroresUnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)
. fullFilePath es una combinación de tipo str y string tomada de la columna de texto de la tabla db que debe tener codificación utf-8.str
objetos, puede estar mezclando codificaciones. ¿Puedes mostrar el resultado deprint repr(fullFilePath)
?cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
str
es la representación del texto en bytes,unicode
es la representación del texto en caracteres.Decodifica texto de bytes a Unicode y codifica un Unicode en bytes con algo de codificación.
Es decir:
>>> 'abc'.decode('utf-8') # str to unicode u'abc' >>> u'abc'.encode('utf-8') # unicode to str 'abc'
fuente
unicode
habla de letras o símbolos, o más genéricamente: runas whilestr
representa una cadena de bytes en una determinada codificación, que debesdecode
(obviamente en la codificación correcta) para obtener las runas específicas'str' object has no attribute 'decode'
Asegúrese de haber establecido la configuración regional justo 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 setlocale
.fuente