我在对path变量进行编码并将其插入到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
发布于 2012-04-24 05:15:33
您错误地使用了encode("utf-8")
。Python字节字符串(str
类型)有编码,Unicode没有。您可以使用uni.encode(encoding)
将Unicode字符串转换为Python字节字符串,并且可以使用s.decode(encoding)
(或等效的unicode(s, encoding)
)将字节字符串转换为Unicode字符串。
如果fullFilePath
和path
当前是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-24 05:08:53
str
是以字节为单位的文本表示,unicode
是以字符为单位的文本表示。
您可以将文本从字节解码为unicode,并使用某种编码将unicode编码为字节。
这就是:
>>> 'abc'.decode('utf-8') # str to unicode
u'abc'
>>> u'abc'.encode('utf-8') # unicode to str
'abc'
更新2020年9月:答案是在Python 2使用最多的时候编写的。在Python3中,str
被重命名为bytes
,unicode
被重命名为str
。
>>> b'abc'.decode('utf-8') # bytes to str
'abc'
>>> 'abc'.encode('utf-8'). # str to bytes
b'abc'
发布于 2017-09-26 19:56:16
确保在从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
。
https://stackoverflow.com/questions/10288016
复制相似问题