您的源输入错误。无论您输入什么source
和text
文字,Python 都没有读取正确的 unicode 代码点。
相反,我强烈怀疑PYTHONIOENCODING
变量已经设置为错误处理程序设置为replace
. 这会导致 Python用问号替换它无法识别的所有代码点。所有西里尔文输入都被视为无法识别。
因此,翻译映射中唯一的代码点是 63,即问号,映射到中的最后一个字符symbols[1]
(这是只有一个唯一键的字典理解的预期行为):
>>> unichr(63)
u'?'
>>> unichr(69)
u'E'
同样的问题适用于您的text
unicode 字符串;它也只包含问号。翻译映射用字母替换每个E
:
>>> u'?????? ???'.translate({63, 69})
u'EEEEEE EEE'
您需要避免输入西里尔文字字符或修复您的输入法。
在终端中,这是您的终端(或 Windows 控制台)支持的编解码器的功能。配置正确的代码页(Windows)或区域设置(POSIX 系统)以输入和输出支持西里尔文的编码(最好是 UTF-8)。
在 Python 源文件中,通过文件顶部的编解码器注释告诉 Python 用于字符串文字的编码。
避免文字意味着使用 Unicode 转义序列:
symbols = (
u'\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0437\u0438\u0439\u043a\u043b\u043c'
u'\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u044a\u044b\u044c\u044d'
u'\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0417\u0418\u0419\u041a\u041b\u041c'
u'\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u042a\u042b\u042c\u042d',
u"abvgdeezijklmnoprstufh'y'eABVGDEEZIJKLMNOPRSTUFH'Y'E"
)
tr = {ord(a):ord(b) for a, b in zip(*symbols)}
text = u'\u0414\u043e\u0431\u0440\u044b\u0439 \u0414\u0435\u043d'
print text.translate(tr)