在Python中使用unicode()和encode()函数
我有一个pathvariables的编码问题,并将其插入到SQLite数据库。 我试图解决它与编码(“utf-8”)function没有帮助。 然后我使用unicode()函数,它给我types的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'>
最后我得到了unicodetypes,但是当pathvariables的types是str时,仍然存在相同的错误
sqlite3.ProgrammingError:除非使用可解释8位字节串的text_factory(如text_factory = str),否则不得使用8位字节串。 强烈build议您将应用程序切换为Unicodestring。
你能帮我解决这个错误,并解释正确的使用encode("utf-8")
和unicode()
函数? 我经常与之战斗。
编辑:
这个execute()语句引发了这个错误:
cur.execute("update docs set path = :fullFilePath where path = :path", locals())
我忘了改变同样问题的fullFilePathvariables的编码,但我现在很困惑。 我应该只使用unicode()还是编码(“utf-8”)或两者?
我不能用
fullFilePath = unicode(fullFilePath.encode("utf-8"))
因为它引发了这个错误:
UnicodeDecodeError:'ascii'编解码器无法解码32位中的字节0xc5:序号不在范围内(128)
Python版本是2.7.2
您正在使用encode("utf-8")
不正确。 Python字节string( str
types)具有编码,Unicode不具有。 您可以使用uni.encode(encoding)
将Unicodestring转换为Python字节string,并且可以使用s.decode(encoding)
(或等价地, unicode(s, encoding)
)将字节string转换为Unicodestring。
如果fullFilePath
和path
目前是一个str
types,你应该弄清楚它们是如何编码的。 例如,如果当前的编码是utf-8,你可以使用:
path = path.decode('utf-8') fullFilePath = fullFilePath.decode('utf-8')
如果这不能解决它,实际的问题可能是你的execute()
调用中没有使用Unicodestring,请尝试将其更改为以下内容:
cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
str
是以字节为单位的文本表示, unicode
是以字符表示的文本表示。
您将文本从字节解码为unicode,并使用某种编码将unicode编码为字节。
那是:
>>> 'abc'.decode('utf-8') # str to unicode u'abc' >>> u'abc'.encode('utf-8') # unicode to str 'abc'
确保在从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
。