Хотите, чтобы Python 27 печатал иностранные символы - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю над школьным проектом с использованием Google App Engine и Python 2.7.Я пытаюсь вывести вложенный словарь так: {city:[{song1:artist1},{song2:artist2}], city2:[{song1:artist1},{song2:artist2}]}.Тем не менее, названия городов и песни со всего мира, с особыми иностранными персонажами.Когда я распечатываю словарь, я получаю следующую строку:

{'uOsaka'[{'u\u3086\u3081\u3044\u3089\u3093\u304b\u306d': u'Takajin Yashiki} и т. Д. (Где Осака - город, юникод - это песня, а Такадзин - художник)

Кто-нибудь знает, как правильно отобразить названия городов / песен?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Как и в Как печатать национальные символы в представлении списка? , вам нужно использовать пользовательскую процедуру для печати ваших данных, которая будет печатать сами строки вместо их repr:

def nrepr(data):
    city_items=[]
    for city, jukebox in data.iteritems():
       jukebox_items=[]
       for song,artist in jukebox.iteritems():
           jukebox_items.append(u'"%s":"%s"' % (song,artist) )
       city_items.append(u'"%s":{%s}' % (city, u",".join(jukebox_items)))
    return u'{%s}' % u",".join(city_items)

>>>  data={u'Osaka':{u'\u3086\u3081\u3044\u3089\u3093\u304b\u306d':u'Takajin Yashiki'}}

>>> print nrepr(data)
{"Osaka":{"ゆめいらんかね":"Takajin Yashiki"}}

(используйте from __future__ import unicode_literals в начале файла, чтобы не ставить u перед каждым литералом)

Вы не обязаны имитировать выходной формат Python по умолчанию, вы можете напечататьони могут быть любыми.


В качестве альтернативы вы можете использовать подкласс unicode для ваших строк, которые будут иметь repr с национальными символами:

class nu(unicode):
    def __repr__(self):
        return self.encode('utf-8')    #must return str

>>> data={nu(u'Osaka'):{nu(u'\u3086\u3081\u3044\u3089\u3093\u304b\u306d'):nu(u'Takajin Yashiki')}}
>>> data
{Osaka: {ゆめいらんかね: Takajin Yashiki}}

Это проблематично, так как вывод cuz repr должен содержать только символы ASCII, и на это опирается различный код. С большой вероятностью вы получите UnicodeError s в случайных местах . Также будет напечатано mojibake , если кодировка определенного выходного канала отличается от utf-8 или если требуется дальнейшее транскодирование.

0 голосов
/ 29 ноября 2018

Основная проблема в Python 2.7 заключается в том, что печать словаря включает преобразование его в строку, и эта строка будет str, а не unicode.Отсюда и ваш вывод.

Однако, когда вы визуализируете отдельные элементы, вы обнаружите, что они в порядке:

>>> d = {u'Osaka': [{u'\u3086\u3081\u3044\u3089\u3093\u304b\u306d': u'Takajin Yashiki'}]} 
>>> for k, v in d.viewitems():
...   for pair in v:
...     for song, artist in pair.viewitems():
...         print k, song, artist
... 
Osaka ゆめいらんかね Takajin Yashiki

Обратите внимание, что это поведение Python 2.В Python 3, где str - это текст, эти данные будут напечатаны как UTF-8 и должны естественно отображаться в консоли, если у вас установлены необходимые шрифты для японских глифов:

(3.7) >>> print(d)
{'Osaka': [{'ゆめいらんかね': 'Takajin Yashiki'}]}
...