84

我在编码路径变量并将其插入SQLite数据库时遇到问题。我尝试使用无帮助的encode("utf-8")函数来解决它。然后我使用了unicode()函数,它给了我类型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'>

最后我获得了unicode类型,但是当路径变量的类型为str时,我仍然遇到相同的错误

sqlite3.ProgrammingError:除非您使用可以解释 8 位字节串的 text_factory(如 text_factory = str),否则不得使用 8 位字节串。强烈建议您将应用程序切换为 Unicode 字符串。

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

编辑:

execute()语句引发了错误:

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

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

我无法使用

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

因为它引发了这个错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置 32 中的字节 0xc5:序数不在范围内(128)

Python版本为2.7.2

4

3 回答 3

130

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

您将文本从字节解码为 un​​icode,并将 unicode 编码为具有某种编码的字节。

那是:

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

UPD Sep 2020:答案是在 Python 2 主要使用时编写的。在 Python 3 中,str重命名为bytesunicode并重命名为str.

>>> b'abc'.decode('utf-8') # bytes to str
'abc'
>>> 'abc'.encode('utf-8'). # str to bytes
b'abc'
于 2012-04-23T21:08:53.367 回答
88

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

如果fullFilePathpath当前是一种str类型,您应该弄清楚它们是如何编码的。例如,如果当前编码是 utf-8,您将使用:

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

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

cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
于 2012-04-23T21:15:32.850 回答
1

确保您在从 shell 运行脚本之前设置了您的语言环境设置,例如

$ 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 locale,,man setlocale

于 2017-09-26T11:56:15.530 回答