Python中unicode()和encode()函数的用法


83

我在对路径变量进行编码并将其插入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类型,但是当path变量的类型为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


引发错误的代码在哪里?
newtover 2012年


@newtover我编辑了问题。
xralf 2012年

您是否将两个使用过的变量都转换为unicode
newtover 2012年

2
学习Python 3如何处理文本和数据确实帮助我理解了一切。它是那么容易的知识应用到Python的2
奥莱Prypin

Answers:


87

您使用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())

该语句fullFilePath = fullFilePath.decode("utf-8")仍然引发错误UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)。fullFilePath是str类型和取自db表的文本列的字符串的组合,该字符串应为utf-8编码。
xralf 2012年

根据这个,但也可以是UTF-8,UTF-16BE或UTF-16LE。我能以某种方式找到它吗?
xralf 2012年

@xralf,如果要组合不同的str对象,则可能正在混合编码。您可以显示的结果print repr(fullFilePath)吗?
安德鲁·克拉克

我只能在调用encode()之前显示它。有问题的字符是\ u016​​1和\ u016​​5。
xralf 2012年

@xralf-所以已经是unicode了?尝试将执行调用更改为unicode:cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
安德鲁·克拉克

121

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

您将字节中的文本解码为unicode,然后以某种编码将unicode编码为字节。

那是:

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

1
很好的答案,直截了当。我要补充unicode说的是字母或符号,或更笼统地说:符文同时str以某种编码表示一个字节字符串,您必须decode(显然是正确的编码)才能获得特定的符文
arainone

Python 3.8 >>'str' object has no attribute 'decode'
Yohan Obadia

1

确保从外壳程序运行脚本之前就已经设置了语言环境设置,例如

$ 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.