2012-03-26 3 views
1

Jetzt verwende ich elixir mit meiner MySQL-Datenbank und die redispy mit redis und ich wähle UTF-8 an allen Orten. Ich will in der chinesischen einige Daten schriftlich zu bekommen wie {'Info':‘8折’,'Name':'家乐福'} aber was habe ich so:Unicode in Python

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

und nachdem ich dieses dict speichern und auf Redis von redispy wird es raus:

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

Ich weiß, wenn ich u' vor 8\u6298 hinzufügen und es ausdrucken, wird es mir "8折" aber gibt es eine Funktion oder eine andere Lösung für dieses Problem?

+0

Wie sicher bist du, dass der zweite tatsächlich ein 'dict' ist? –

+0

Ich spalte alle Werte und sende sie an die Redis als Liste. Wenn ich den Wert bekommen möchte, ziehe ich sie einfach heraus und mache es als Diktat im Programm – Daemoneye

+0

Also, wenn Sie den tatsächlichen Wert ausdrucken, erhalten Sie '8 \ u6298' dann? –

Antwort

0

Letztere sieht aus wie json, versuchen Sie es zuerst Decodierung:

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

Oh durch ihre rechts – Daemoneye

1

Sie sehen nur die repr (gegenständliche) Zeichenfolge. Aber es ist der gleiche Unicode in der internen Zeichenfolge.

Try this:

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, aber Sie sind nicht das zurück zu bekommen. Sie haben das Nicht-Unicode-Formular zurück. Ein schneller Hack ist es, es auszuwerten.

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

Aber besser wäre herauszufinden, warum das System den Unicode nicht umläuft.

+0

Ausgenommen der Ausdruck hat nicht das Präfix "u". –

+0

@ IgnacioVazquez-Abrams \t Es tut in Python 2.x. – Keith

+0

Sehen Sie sich die Frage noch einmal an. –

0

Wenn Sie die unicodierten Version der Zeichenfolge wollen, werfen Sie einen Blick here

+0

... Du wirst die Punkte ein wenig verbinden müssen le besser als das ... –

1

Sie u‘hinzufügen, bevor 8 \ u6298, Python Speichern Sie diesen Wert als Unicode-Instanz, die kein Codierungsformat hat.

Bevor Sie die Daten in redis einfügen, müssen Sie Ihre Unicode-Instanz codieren, um sie zu einer echten Zeichenfolge zu machen.

Sie wählen UTF-8 an allen Platz, so dass nur

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

Shop y anstelle von x. Die Sie aus der Datenbank lesen, wird die Ausgabe eine Zeichenfolge sein '8\xe6\x8a\x98' (8 折), keine Python-Instanz '8\u6298' mehr.

+0

Warum kann man das nicht wieder von allein schaffen? –

+0

Das ist die Python-Schnittstelle, die redis-py dazu verpflichtet ist. Kodierung vor dem Ausgang/Eingang. – wangeek