为什么我能';t在python中交换unicode字符

为什么我能';t在python中交换unicode字符,python,python-2.7,unicode,unicode-string,python-unicode,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) 产出:idzie wąwąwąskądróką 预期输出:idzie waz waska drozka

为什么我不能在代码中交换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)
产出:idzie wąwąwąskądróką


预期输出:idzie waz waska drozka

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

>>> 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将其拆分为两部分
\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']

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

更改这两行,它应该可以工作:

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

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

您想做什么?正如您在代码中看到的,将一个字符替换为另一个字符,将ą改为a、ż改为z和ó改为o(波兰语特定字母)@Gunnm提供了预期的输出。您是否收到任何错误或类似错误?一点也没有。它只是忽略了字符交换中的内容,但如果您添加普通的字母,如fe交换d换d或i换q,它就可以工作了。由于某种原因,它只在波兰语字母上有问题,只是跳过了它们。您可以复制并粘贴此代码。我正在使用PyCharm与pythonIt works合作。非常感谢您对如何准确解码和编码命令工作的帮助?@gunn欢迎。让我解释一下!;)