如何使用Python 2.7将Cyrillic音译为拉丁语? - 不正确的翻译输出

时间:2013-09-24 17:53:50

标签: python python-2.7 translation

我试图从excel文件中将西里尔语音译为拉丁语。我从下往上工作,无法弄清楚为什么这不起作用 当我尝试翻译简单的文本字符串时,Python输出“EEEEE EEE”而不是正确的翻译。我怎么能解决这个问题才能给我正确的翻译?我一整天都想弄清楚这一点!

symbols = (u"абвгдеёзийклмнопрстуфхъыьэАБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ",
           u"abvgdeezijklmnoprstufh'y'eABVGDEEZIJKLMNOPRSTUFH'Y'E")

tr = {ord(a):ord(b) for a, b in zip(*symbols)}

text = u'Добрый Ден'
print text.translate(tr)

>>EEEEEE EEE

我很感激帮助!

1 个答案:

答案 0 :(得分:3)

您的来源输入错误。无论您输入了sourcetext文字,Python都没有读取正确的unicode代码点。

相反,我强烈怀疑PYTHONIOENCODING variable之类的内容已设置为错误处理程序设置为replace。这会导致Python替换识别的所有代码点。 所有西里尔语输入都被视为无法识别。

因此,翻译地图中唯一的代码点是63,问号,映射到symbols[1]中的最后一个字符(这是字典理解的预期行为,只有一个唯一键):

>>> unichr(63)
u'?'
>>> unichr(69)
u'E'

同样的问题适用于您的text unicode字符串;它只包含问号。翻译映射将每个替换为字母E

>>> u'?????? ???'.translate({63, 69})
u'EEEEEE EEE'

您需要避免输入西里尔字面字符或修改输入法。

在终端中,这是您的终端(或Windows控制台)支持的编解码器的功能。配置正确的代码页(窗口)或区域设置(POSIX系统)以输入和输出支持西里尔文的编码(UTF-8最好)。

在Python源文件中,告诉Python有关使用codec comment at the top of the file的字符串文字的编码。

避免文字意味着使用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)