sqlite 在Python中使用unicode()和encode()函数

flseospp  于 2022-11-15  发布在  SQLite
关注(0)|答案(3)|浏览(137)

我对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时出现的错误
编程错误:除非使用可以解释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*
mqkwyuun

mqkwyuun1#

str是以字节为单位的文本表示,unicode是以字符为单位的文本表示。
您可以将文本从字节解码为Unicode,并使用某种编码将Unicode编码为字节。
即:

>>> 'abc'.decode('utf-8')  # str to unicode
u'abc'
>>> u'abc'.encode('utf-8') # unicode to str
'abc'
  • 更新2020年9月*:答案是在使用最多的时候写的。在Python3中,str被重命名为bytesunicode被重命名为str
>>> b'abc'.decode('utf-8') # bytes to str
'abc'
>>> 'abc'.encode('utf-8'). # str to bytes
b'abc'
qojgxg4l

qojgxg4l2#

您错误地使用了encode("utf-8")。Python字节字符串(str类型)有编码,而Unicode没有。可以使用uni.encode(encoding)将Unicode字符串转换为Python字节字符串,使用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())
agyaoht7

agyaoht73#

确保在从外壳运行脚本之前正确设置了区域设置,例如

$ 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

相关问题