关于字符串:在python中使用unicode()和encode()函数

Usage of unicode() and encode() functions in Python

我在对路径变量进行编码并将其插入到sqlite数据库时遇到问题。我试图用没有帮助的编码("utf-8")函数来解决这个问题。然后我使用了unicode()函数,它给了我unicode类型。

1
2
3
4
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'>

最后,我得到了unicode类型,但是我仍然有同样的错误,当路径变量的类型是str时仍然存在。

sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless
you use a text_factory that can interpret 8-bit bytestrings (like
text_factory = str). It is highly recommended that you instead just
switch your application to Unicode strings.

你能帮我解决这个错误并解释一下encode("utf-8")unicode()函数的正确用法吗?我经常和它打架。

编辑:

此execute()语句引发了错误:

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

我忘了改变fullfilepath变量的编码,它也有同样的问题,但是我现在很困惑。我应该只使用unicode()或encode("utf-8")还是两者都使用?

我不能用

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

因为它引发了这个错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position
32: ordinal not in range(128)

python版本是2.7.2


str是以字节表示的文本,unicode是以字符表示的文本。

将文本从字节解码为Unicode,并使用某些编码将Unicode编码为字节。

即:

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


您使用encode("utf-8")不正确。python字节字符串(str类型)有编码,unicode没有。可以使用uni.encode(encoding)将unicode字符串转换为python字节字符串,也可以使用s.decode(encoding)将字节字符串转换为unicode字符串(或等同于unicode(s, encoding))。

如果fullFilePathpath当前是str类型,您应该知道它们是如何编码的。例如,如果当前编码是UTF-8,则将使用:

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

如果这样做不能解决问题,实际的问题可能是您在execute()调用中没有使用unicode字符串,请尝试将其更改为以下内容:

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


在从shell运行脚本之前,确保已经设置了区域设置,例如

1
2
3
4
5
$ 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

文件:man localeman setlocale