在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( strtypes)具有编码,Unicode不具有。 您可以使用uni.encode(encoding)将Unicodestring转换为Python字节string,并且可以使用s.decode(encoding) (或等价地, unicode(s, encoding) )将字节string转换为Unicodestring。

如果fullFilePathpath目前是一个strtypes,你应该弄清楚它们是如何编码的。 例如,如果当前的编码是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 localeman setlocale