2012-03-26 4 views
1

Теперь я использую эликсир с моей базой данных mysql и redispy с redis, и я выбираю UTF-8 во всем месте. Я хочу, чтобы получить некоторые записи данных на китайском языке, как {'Info':‘8折’,'Name':'家乐福'} но то, что я получил, как это:Юникод в python

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

и после того, как я хранить эту Dict, чтобы Redis и получить его по redispy становится:

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

Я знаю, если я добавлю u' до 8\u6298 и распечатаю его, это будет shou me "8折", но есть функция или другое решение этой проблемы?

+0

Как вы уверены, что второй на самом деле является «dict»? –

+0

Я разделил все значение и отправлю их в redis как список. когда я хочу получить значение, я просто вытаскиваю их и делаю это как dict в программе. – Daemoneye

+0

Итак, если вы распечатываете фактическое значение, вы получаете '8 \ u6298' то? –

ответ

0

Последнее выглядит как 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'} 
+0

Ой спасибо, его right – Daemoneye

1

Вы просто видите строку repr (репрезентативная). Но это один и тот же юникод во внутренней строке.

Попробуйте это:

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"] 
家乐福 

Oh, но вы не получаете его обратно. У вас есть форма, отличная от юникода. Один быстрый взлом - это оценить его.

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

Но лучше было бы выяснить, почему система не отключает округление юникода.

+0

За исключением того, что в реестре нет префикса 'u'. –

+0

@ IgnacioVazquez-Abrams \t Он делает это в Python 2.x. – Keith

+0

Посмотрите на вопрос еще раз. –

0

Если вы хотите, в кодировке unicode версии строки, посмотри here

+0

... Вам нужно будет подключить точки a litt le лучше, чем это ... –

1

Вы добавить и»до 8 \ u6298, питона сохраните это значение как экземпляр 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折 

магазин у вместо х. Вы читаете из базы данных, результатом будет строка '8\xe6\x8a\x98' (8 折), а не экземпляр python '8\u6298'.

+0

Почему вы не можете сделать redis самостоятельно? –

+0

Это обязанность redis-py интерфейса python сделать это. Кодировать до выхода/ввода. – wangeek

Смежные вопросы