编码西里尔字母?

时间:2014-01-26 13:51:40

标签: python encoding

我需要将西里尔字母改为拉丁字母(我们只考虑两个字母):

 # -*- coding: utf-8 -*-
 import re 
 vac = {'а': 'a', 'б': 'b'}
 s = 'абба'
 re.sub('а', vac['а'], s)
 re.sub('б', vac['б'], s)
 print s # works fine, prints "abba" 
 s = 'абба'
 # doesn't work in loop
 for ch in vac:
     s = re.sub(unicode(ch, 'utf-8'), vac[unicode(ch, 'utf-8')], s)
 print s
UPD:谢谢你们,伙计们。根据你的答案,我编写了工作函数:

 # -*- coding: utf-8 -*-
 def translit(s):
     symbols = (u"абвгдеёзийклмнопрстуфхъыьэюАБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭЬЬЮ",
     u"abvgdeezijklmnoprstufh'y'euABVGDEEZIJKLMNOPRSTUFH'Y'EU")
     tr = {ord(a):ord(b) for a, b in zip(*symbols)}
     vac = {u'я': 'ya', u'ж': 'zh', u'ц': 'ts', u'ч': 'ch', u'ш': 'sh', u'щ': 'sch', u'Я': 'Ya', u'Ч': 'Ch', u'Ш': 'Sh', u'Щ': 'Sch', u'Ж': 'Zh', u'Ц': 'Ts'}

     s = s.translate(tr)
     s = ''.join([vac.get(c, c) for c in s])
     return s

 s = u"Лорем ипсум, напиши translit'ом"
 a = translit(s)
 print a 

2 个答案:

答案 0 :(得分:0)

您需要将字典键和字符串更改为unicode字符串,通过为u添加前缀来执行此操作:

# -*- coding: utf-8 -*-
vac = {'а': 'a', u'б': 'b'}
s = u'абба'
print ''.join([vac.get(c, c) for c in s])

输出:

аbbа

答案 1 :(得分:0)

Regex不适合您的工作。很遗憾,unicode.encode无法以统一的方式转换为latin,因此您最好的选择是使用unicode.translate

# -*- coding: utf-8 -*-
symbols = (u"абвгдеёзийклмнопрстуфхъыьэАБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ",
           u"abvgdeezijklmnoprstufh'y'eABVGDEEZIJKLMNOPRSTUFH'Y'E")
tr = {ord(a):ord(b) for a, b in zip(*symbols)}
s = u'абба'
print s.translate(tr)

好处是,你不需要在循环中运行它

您也可以尝试使用python包transliterate