为什么我不能在python中交换unicode字符

时间:2015-07-02 06:15:52

标签: python python-2.7 unicode unicode-string python-unicode

为什么我不能在代码中交换unicode字符?

# -*- coding: utf-8 -*-

character_swap = {'ą': 'a', 'ż': 'z', 'ó': 'o'}

text = 'idzie wąż wąską dróżką'

print text

print ''.join(character_swap.get(ch, ch) for ch in text)

输出:idziewążwąskądróżką

预期输出:idzie waz waska drozka

2 个答案:

答案 0 :(得分:3)

您需要先对文本进行编码,然后再次对字符进行解码:

>>> print ''.join(character_swap.get(ch.encode('utf8'), ch) for ch in text.decode('utf8'))
idzie waz waska drozka

因为python列表的理解并没有默认编码你的unicode,实际上你正在做的是:

>>> [i for i in text]
['i', 'd', 'z', 'i', 'e', ' ', 'w', '\xc4', '\x85', '\xc5', '\xbc', ' ', 'w', '\xc4', '\x85', 's', 'k', '\xc4', '\x85', ' ', 'd', 'r', '\xc3', '\xb3', '\xc5', '\xbc', 'k', '\xc4', '\x85']

对于像ą这样的角色,我们有:

>>> 'ą'
'\xc4\x85'

正如你在列表中看到的那样,理解python将它分成2部分\xc4\x85。因此,为了获得它,您可以通过utf8包围来解码您的文字:

>>> [i for i in text.decode('utf8')]
[u'i', u'd', u'z', u'i', u'e', u' ', u'w', u'\u0105', u'\u017c', u' ', u'w', u'\u0105', u's', u'k', u'\u0105', u' ', u'd', u'r', u'\xf3', u'\u017c', u'k', u'\u0105']

答案 1 :(得分:2)

您的字符串应存储为unicode字符串。

更改这两行,它应该有效:

character_swap = {u'ą': 'a', u'ż': 'z', u'ó': 'o'}

text = u'idzie wąż wąską dróżką'