在使用redis,python库是redis-py,保存到redis以后再取出,所有的unicode都变成了str类型,然后程序就报错了,请问有什么简单的方法可以在取出来的时候把字段都改回unicode吗?

2012-05-15 11:35:07 +08:00
 goofansu
google下,有些回答是在字符串前加u''或者unicode(str,'utf-8')方法转换,可是我现在因为使用的hmset和hgetall保存整个对象,取出也是整个对象,所以想问下有没有现成的方法可以进行转换的。取出如果是中文的话是这样的:
{'name': 'match', 'title': '\xe6\xaf\x94\xe8\xb5\x9b', 'section_title': '\xe6\xb4\xbb\xe5\x8a\xa8', '_id': '4fb1c6329b10ed1adc000000', 'id': '1'}
是英文的话就直接显示了英文

报错还是老样子:
'ascii' codec can't decode byte 0xe6 in position 12,
7977 次点击
所在节点    Redis
5 条回复
solowind
2012-05-15 12:05:13 +08:00
习惯在写入和读取的时候都做unicode转码,用Python来保证,例如

def _unicode(s):
if isinstance(s, str):
try:
return s.decode('utf-8')
except UnicodeDecodeError:
pass
return s

Redis怎么配置不太清楚,这个代码好像是从Tornado里面找到的
goofansu
2012-05-15 12:11:14 +08:00
@solowind 谢谢。数据在数据库中都是unicode的,可是保存到redis中它会自动转成str,再取出就不对了,网上搜了下也没搜出什么结果。
gonbo
2012-05-15 12:19:41 +08:00
@goofansu redis-py的代码里面是做过encoding到utf-8的。不能encoding才str。你可以文件里面加上 # -*- coding: UTF-8 -*-
goofansu
2012-05-15 13:29:30 +08:00
@gonbo 好的,我试试
maga
2014-07-20 10:55:43 +08:00
ecode_responses=True 参数

Looking into the StrictRedis.__init__ there is a parameter decode_responses which by default is False. https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L284 (line num may change in future, look in __init__).

Pass in decode_responses=True on construct and for me this FIXES THE OP'S ISSUE.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/35998

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX