Usage of unicode() and encode() functions in Python
我在对路径变量进行编码并将其插入到sqlite数据库时遇到问题。我试图用没有帮助的编码("utf-8")函数来解决这个问题。然后我使用了unicode()函数,它给了我unicode类型。
1 2 3 4 | 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类型,但是我仍然有同样的错误,当路径变量的类型是str时仍然存在。
sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless
you use a text_factory that can interpret 8-bit bytestrings (like
text_factory = str). It is highly recommended that you instead just
switch your application to Unicode strings.
你能帮我解决这个错误并解释一下
编辑:
此execute()语句引发了错误:
1 | cur.execute("update docs set path = :fullFilePath where path = :path", locals()) |
我忘了改变fullfilepath变量的编码,它也有同样的问题,但是我现在很困惑。我应该只使用unicode()或encode("utf-8")还是两者都使用?
我不能用
1 | fullFilePath = unicode(fullFilePath.encode("utf-8")) |
因为它引发了这个错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position
32: ordinal not in range(128)
python版本是2.7.2
将文本从字节解码为Unicode,并使用某些编码将Unicode编码为字节。
即:
1 2 3 4 | >>> 'abc'.decode('utf-8') # str to unicode u'abc' >>> u'abc'.encode('utf-8') # unicode to str 'abc' |
您使用
如果
1 2 | path = path.decode('utf-8') fullFilePath = fullFilePath.decode('utf-8') |
如果这样做不能解决问题,实际的问题可能是您在
1 | cur.execute(u"update docs set path = :fullFilePath where path = :path", locals()) |
在从shell运行脚本之前,确保已经设置了区域设置,例如
1 2 3 4 5 | $ 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 |
文件: