85 votes

Utilisation des fonctions unicode() et encode() en Python

J'ai un problème avec l'encodage du chemin et l'insérer dans la variable SQLite base de données. J'ai essayé de résoudre le problème avec encode("utf-8") ce qui n'a pas aidé. J'ai ensuite utilisé unicode() qui me donne le type 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'>

Finalement, j'ai obtenu unicode mais j'ai toujours la même erreur qui était présente lorsque le type de l'élément chemin était la variable str

sqlite3.ProgrammingError : Vous ne devez pas utiliser de bytestrings 8 bits à moins que vous n'utilisiez pas une fabrique de texte capable d'interpréter des chaînes d'octets 8 bits (comme text_factory = str). Il est fortement recommandé de de basculer votre application sur des chaînes Unicode.

Pourriez-vous m'aider à résoudre cette erreur et m'expliquer l'utilisation correcte de encode("utf-8") y unicode() fonctions ? Je me bats souvent avec elle.

EDIT :

Este exécuter() a provoqué l'erreur :

cur.execute("update docs set path = :fullFilePath where path = :path", locals())

J'ai oublié de modifier l'encodage de chemindufichiercomplet qui souffre du même problème, mais je suis assez confus maintenant. Dois-je utiliser uniquement unicode() o encode("utf-8") ou les deux ?

Je ne peux pas utiliser

fullFilePath = unicode(fullFilePath.encode("utf-8"))

parce qu'il soulève cette erreur :

UnicodeDecodeError : le codec 'ascii' ne peut pas décoder l'octet 0xc5 en position 32 : l'ordinal n'est pas dans l'intervalle(128)

Python est 2.7.2

135voto

newtover Points 12301

str est la représentation du texte en octets, unicode est la représentation du texte en caractères.

Vous décodez le texte des octets en unicode et vous encodez un unicode en octets avec un certain encodage.

C'est-à-dire :

>>> 'abc'.decode('utf-8')  # str to unicode
u'abc'
>>> u'abc'.encode('utf-8') # unicode to str
'abc'

UPD Sep 2020 : La réponse a été écrite lorsque Python 2 était principalement utilisé. En Python 3, str a été renommé en bytes et unicode a été renommé en str .

>>> b'abc'.decode('utf-8') # bytes to str
'abc'
>>> 'abc'.encode('utf-8'). # str to bytes
b'abc'

88voto

Andrew Clark Points 77748

Vous utilisez encode("utf-8") incorrectement. Les chaînes d'octets Python ( str ) ont un encodage, ce qui n'est pas le cas d'Unicode. Vous pouvez convertir une chaîne Unicode en chaîne d'octets Python à l'aide de la fonction uni.encode(encoding) et vous pouvez convertir une chaîne d'octets en chaîne Unicode en utilisant s.decode(encoding) (ou de manière équivalente, unicode(s, encoding) ).

Si fullFilePath y path sont actuellement une str vous devez déterminer comment ils sont codés. Par exemple, si l'encodage actuel est utf-8, vous utiliserez :

path = path.decode('utf-8')
fullFilePath = fullFilePath.decode('utf-8')

Si cela ne résout pas le problème, il se peut que vous n'utilisiez pas une chaîne de caractères Unicode dans votre fichier execute() essayez de le remplacer par ce qui suit :

cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())

1voto

kenorb Points 2464

Assurez-vous que vos paramètres linguistiques sont corrects avant d'exécuter le script à partir du shell, par ex.

$ 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

Docs : man locale , man setlocale .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X