Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的Unicode_Python_Unicode_Sqlalchemy_Redis_Python Unicode - Fatal编程技术网

python中的Unicode

python中的Unicode,python,unicode,sqlalchemy,redis,python-unicode,Python,Unicode,Sqlalchemy,Redis,Python Unicode,现在我在mysql数据库中使用elixir,在redis中使用Redisy,我在所有地方都选择UTF-8。 我想用中文写一些数据,比如{'Info':'8折’,'名称':'家乐福'}但我得到的是这样的: {'Info': u'8\u6298', 'Name': u'\u5bb6\u4e50\u798f'} 在我将这个dict存储到redis并通过Redisp将其取出后,它变成: {"Info": "8\u6298", "Name": "\u5bb6\u4e50\u798f"} 我知道如果我在

现在我在mysql数据库中使用elixir,在redis中使用Redisy,我在所有地方都选择UTF-8。 我想用中文写一些数据,比如
{'Info':'8折’,'名称':'家乐福'}但我得到的是这样的:

{'Info': u'8\u6298', 'Name': u'\u5bb6\u4e50\u798f'}
在我将这个dict存储到redis并通过Redisp将其取出后,它变成:

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

我知道如果我在
8\u6298
之前添加
u'
,并将其打印出来,它将告诉我
“8折"
但是这个问题有没有函数或其他解决方案?

您只看到了
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进行往返操作。

后者看起来像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'}

如果需要字符串的unicode版本,请查看在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折
>x=u'8\u6298'
>>>类型(x)
>>>y=x.encode('utf8')
>>>类型(y)
>>>y
“8\xe6\x8a\x98”
>>>打印y
8.折

存储y而不是x。从数据库中读取的值将是字符串
'8\xe6\x8a\x98'
(8折), 不再是python实例了。

你有多确定第二个实例实际上是一个
dict
?我将所有的值拆分并作为列表发送到redis。当我想要得到值时,我只需将它们取出并在程序中作为dict。如果你打印出得到的实际值,那么?是的。所以我需要将这些8\u6298转换回'8'的方法吗折'. 在shell中,我可以很容易地手动添加一个u,但在代码中,我真的不想知道redis为什么首先会出错,而不是如何修复它。除了repr没有
u
前缀。@IgnacioVazquez Abrams在Python 2.x中有。如果没有u'print,它将是8\u6298,而不是'8'折' 这是我的question@IgnacioVazquez-Abrams OIC,它以repr文本的形式返回。我想它应该在存储之前进行编码。eval仍然出错,请看这里:>>>a='\u5bb6\u4e50\u798f'>>>ast.literal\u eval(a)>>>Traceback(最近的调用last):文件“”,第1行,在文件“C:\Python27\lib\ast.py”中,第49行,在文本\u eval node\u或\u string=parse(node\u或\u string,mode='eval')文件“C:\Python27\lib\ast.py”中,第37行,在parse return compile(源、文件名、模式、仅PyCF\u ast)文件中,第1行\u5bb6\u4e50\u798f^语法错误:行继续字符后出现意外字符这是python接口redis py的职责。在输出/输入之前进行编码。