2013-09-24 2 views
0

Я пытаюсь транслитерировать кириллицу на латынь из файла excel. Я работаю снизу вверх и не могу понять, почему это не работает.
Когда я пытаюсь перевести простую текстовую строку, Python выводит «EEEEE EEE» вместо правильного перевода. Как я могу исправить это, чтобы дать мне правильный перевод? Я пытался понять это весь день!Как транслитерировать кириллицу на латинский язык с помощью Python 2.7? - неправильный вывод перевода

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 

Я ценю помощь!

+0

Это прекрасно работает для меня. Что происходит, когда вы запускаете * just * 'text.translate (tr)' (no 'print')? Я получаю «Добрый день». –

+2

Не вставляйте подсказки и диалоги в свой код. Это просто делает его намного труднее для других испытать. – Marcin

+0

@Marc: К сожалению, это стало слишком распространенным стилем здесь, на SO ... но хороший текстовый редактор помогает его преодолеть. – martineau

ответ

3

Ваш источник ввод неправильный. Однако вы ввели свои source и text литералы, Python не читал правильные коды кодировки unicode.

Вместо этого я сильно подозреваю, что PYTHONIOENCODING variable был установлен с обработчиком ошибок, установленным на replace. Это заставляет Python заменить все кодовые точки, которые не распознает с вопросительными знаками. Все Кириллический вход рассматривается как не признанный.

В результате, единственный элемент кода на вашей карте переводческой 63, знак вопроса, отображается на последний символ в symbols[1] (который, как ожидается, поведение для словаря понимания только один уникального ключа):

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

Эта же проблема относится к вашей строке unicode text; он тоже состоит только из вопросительных знаков. Отображение перевода заменяет каждый с буквой 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) 
Смежные вопросы