希望Python 27打印出外来字符

时间:2018-11-28 23:32:36

标签: python python-2.7 unicode jinja2

我正在使用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}等...(大阪是城市,unicode是歌曲,而Takajin是艺术家)

有人知道如何正确显示城市/歌曲的名称吗?

2 个答案:

答案 0 :(得分:1)

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的行为。在str是文本的Python 3中,假定您已为日语字形安装了必要的字体,此数据将以UTF-8格式打印,并且应在控制台中自然呈现:

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

答案 1 :(得分:0)

就像How to print national characters in list representation?一样,您需要使用自定义过程来打印将自己打印字符串而不是它们的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字符,并且各种代码都依赖于此。 You are extremily likely to get UnicodeErrors in random places还将打印mojibake if a specific output channel's encoding is different from utf-8 or if further transcoding is involved.