Юникод в питоне - PullRequest
       14

Юникод в питоне

1 голос
/ 26 марта 2012

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

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

и после того, как я сохраняю этот dict для redis и получаю его с помощью redispy, он становится:

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

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

Ответы [ 4 ]

1 голос
/ 26 марта 2012

Вы добавляете u 'до 8 \ u6298, 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'.

1 голос
/ 26 марта 2012

Вы просто видите 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"]
家乐福

О, но вы не получите это обратно. У вас есть не-Unicode форма обратно. Один быстрый взлом это проверить.

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

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

0 голосов
/ 26 марта 2012

Если вы хотите unicoded версию строки, посмотрите здесь

0 голосов
/ 26 марта 2012

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