1

现在,我将 elixir 与我的 mysql 数据库和 redispy 与 redis 一起使用,并且我在所有地方都选择了 UTF-8。我想用中文写一些数据,{'Info':‘8折’,'Name':'家乐福'}但我得到的是这样的:

{'Info': u'8\u6298', 'Name': u'\u5bb6\u4e50\u798f'}

在我将此字典存储到redis并通过redispy将其取出后,它变为:

{"Info": "8\u6298", "Name": "\u5bb6\u4e50\u798f"}

我知道如果我u'之前添加8\u6298并打印它会告诉我"8折",但是这个问题有没有功能或其他解决方案?

4

4 回答 4

1

您只是看到repr(代表性)字符串。但它在内部字符串中是相同的 unicode。

试试这个:

Python2> d = {'Info': u'8\u6298', 'Name': u'\u5bb6\u4e50\u798f'}
Python2> d
{'Info': u'8\u6298', 'Name': u'\u5bb6\u4e50\u798f'}
Python2> print d["Name"]
家乐福

哦,但你没有得到回报。您有非 unicode 表单返回。一个快速的技巧是评估它。

import ast
ast.literal_eval(d["Name"])

但更好的办法是弄清楚为什么系统没有往返 unicode。

于 2012-03-26T06:50:10.087 回答
1

后者看起来像json,先解码试试:

import json

resp = '{"Info": "8\u6298", "Name": "\u5bb6\u4e50\u798f"}'
print json.loads(resp)

## {u'Info': u'8\u6298', u'Name': u'\u5bb6\u4e50\u798f'}
于 2012-03-26T07:05:07.173 回答
1

您在 8\u6298 之前添加 u',python 将此值存储为 unicode 实例,该实例没有编码格式。

在将数据放入 redis 之前,您必须对 unicode 实例进行编码,使其成为真正的字符串。

您在所有地方都选择了 UTF-8,所以只需

>>> x=u'8\u6298'
>>> type(x)
<type 'unicode'>
>>> y=x.encode('utf8')
>>> type(y)
<type 'str'>
>>> y
'8\xe6\x8a\x98'
>>> print y
8折

存储 y 而不是 x。您从数据库中读取,输出将是一个字符串'8\xe6\x8a\x98'(8 折),不再是 python 实例'8\u6298'

于 2012-03-26T07:11:24.777 回答
0

如果您想要字符串的 unicoded 版本,请查看此处

于 2012-03-26T07:07:18.720 回答