open escape bytes python string sqlite unicode encoding

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''