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

why I can't swap unicode characters in python

为什么我不能在代码中交换 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)

输出:蛇沿着狭窄的路径前进

预期输出:走窄路

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

>>> 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ą'