2017-02-02 4 views
0

Я хочу преобразовать строку в dict на китайский, но не знаю как. Некоторые подсказки были бы полезны для меня.Преобразование Unicode в Python

Мой питон версия 2.7.12 на win32

Прежде всего, у меня есть переменная s

s = '\u7279\u6717\u666e\u5973\u513f\u4f0a\u4e07\u5361\u5230\u4e2d\u56fd\u5927\u4f7f\u9986\u8d3a\u65b0\u5e74' 

И это работает, когда я использовал эти 2 метода: Бо

print u'\u7279\u6717\u666e\u5973\u513f\u4f0a\u4e07\u5361\u5230\u4e2d\u56fd\u5927\u4f7f\u9986\u8d3a\u65b0\u5e74' 

Выход: 特朗普 女儿 伊万卡 到 中国 大使馆 贺 新年

print eval("u'%s'" %s) 

Выход: 特朗普 女儿 伊万卡 到 中国 大使馆 贺 新年

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

data = { 
'title' : s, 
} 
print data 

Выход проявляется как

{ 'название': «\ u7279 \ u6717 \ u666e \ u5973 \ u513f \ u4f0a \ u4e07 \ u5361 \ u5230 \ u4e2d \ u56fd \ u5927 \ u4f7f \ u9986 \ u8d3a \ u65b0 \ u5e74' }

+0

Где вы получите 's'? – Ryan

+0

Где вы управляете? Делает ли (терминал, PowerShell, ..) он поддерживает китайский chracters? – manuzi1

+0

Я запустил его в Pycharm – victordongy

ответ

0

Вы можете декодировать строку в китайский с использованием с использованием unicode escape

В Python 3.x

s = b'\u7279\u6717\u666e\u5973\u513f\u4f0a\u4e07\u5361\u5230\u4e2d\u56fd\u5927\u4f7f\u9986\u8d3a\u65b0\u5e74' 

Обратите внимание на б - байты буквального

print(s.decode('unicode-escape')) 
特朗普女儿伊万卡到中国大使馆贺新年 

В Python 2.x

print s.decode('unicode-escape') 
特朗普女儿伊万卡到中国大使馆贺新年 

Отредактированы: В вашем случае, так как вы используете питон 2.7:

s = u'\u7279\u6717\u666e\u5973\u513f\u4f0a\u4e07\u5361\u5230\u4e2d\u56fd\u5927\u4f7f\u9986\u8d3a\u65b0\u5e74' 

Обратите внимание на использование букв u'- unicode.

теперь, если вы хотите напечатать это только тип print s, печать действует как кодер

, и если вы хотите использовать его в словаре, просто использовать с, потому что в конечном счете он будет храниться в виде строки Юникода и когда вы хотите увидеть результат, просто распечатайте значение.

+0

Каждый узнает что-то новое - первый раз, когда я читал о 'unicode-escape'), и я не могу найти его со встроенным поиском на Python2.x doc ... Но он действительно выполняет работу (на 2.7.6) , –

+0

да, вы правы, вы даже не можете найти его во встроенном поиске .. но эти строки Юникода всегда были головной болью. –

+0

Большое спасибо. Но как я могу распечатать данные, как ожидалось? – victordongy

0

Первый пункт: print data распечатывает внутреннее представление вашего data dict (результат repr(data)), поэтому вы получаете внутреннее представление вашей строки. Вы увидите то же поведение с print repr(s) против print s.

Кроме того, если вы хотите использовать юникод строки, вы должны явно сказать Python это строка Юникода предваряя строку litteral с «и», то есть:

s = u'\u7279\u6717\u666e\u5973\u513f\u4f0a\u4e07\u5361\u5230\u4e2d\u56fd\u5927\u4f7f\u9986\u8d3a\u65b0\u5e74' 
print s 

Это не будет делать print data работают так, как вы ожидаете, но, по крайней мере, вы можете правильно напечатать строку юникода либо как есть, либо путем кодирования нужной кодировки.

NB: если ваша версия Python достаточно современна, вы также можете запустить свой скрипт с __future__ import unicode_literals, который скажет Python обрабатывать каждую и любую литеральную строку в этом модуле как строку юникода.

NB2: если вы получаете строку s с внешнего ресурса, то в этом есть что-то не так - поскольку то, что вы получаете, представляет собой байтовую строку, содержащую точки юникода, - поэтому сначала исправьте эту проблему (вы должны либо правильно закодировать байтовая строка - в известном кодировании - или, предпочтительно, в правильной строке юникода).

+0

Большое спасибо. Я получил свою строку s от обхода данных с помощью «beautifulsoup» и «request» с «http://news.qq.com/», который кодируется в «gb2312». – victordongy

0

Вы можете использовать pprint. Вот ответ кворы, что отвечает на ваше задание. Побежал он в режиме ожидания, чтобы просмотреть uncode строку правильно

https://www.quora.com/How-do-you-print-a-python-unicode-data-structure

import pprint 
_escape = dict((q, dict((c, unicode(repr(chr(c)))[1:-1]) 
         for c in range(32) + [ord('\\')] + 
         range(128, 161), 
         **{ord(q): u'\\' + q})) 
       for q in ["'", '"']) 
class MyPrettyPrinter(pprint.PrettyPrinter): 
    def format(self, object, context, maxlevels, level): 
     if type(object) is unicode: 
      q = "'" if "'" not in object or '"' in object \ 
       else '"' 
      return ("u" + q + object.translate(_escape[q]) + 
        q, True, False) 
     return pprint.PrettyPrinter.format(
      self, object, context, maxlevels, level) 


pp = MyPrettyPrinter() 
s = u'\u7279\u6717\u666e\u5973\u513f\u4f0a\u4e07\u5361\u5230\u4e2d\u56fd\u5927\u4f7f\u9986\u8d3a\u65b0\u5e74' 
print(s) 
data = { 
u'title' : s 
} 
pp.pprint(data) 
Смежные вопросы