Форум сайта python.su
Бывает такое что пользователь отправил данные на английской раскладке, необходимо англ. символы заменить соответствующими на русском.
Вопрос как это сделать?
С maketrans не получается из-за того что разные длины получаются ну и соответственно ругается.
Что-то типа
from string import maketrans # Required to call maketrans function. import string intab = "~!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?" outtab = "ёЁ!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ," trantab = string.maketrans(intab, outtab) str = "ghbdtn vbh"; print str.translate(trantab, 'xm');
Отредактировано igorakintev (Сен. 20, 2012 16:23:23)
Офлайн
Создаете словарь с отображением из латиницы в кириллицу и для каждого символа из полученной строки берете соответствующий ключ из словаря.
Офлайн
fata1exВот, делал уже такое:
Создаете словарь с отображением из латиницы в кириллицу и для каждого символа из полученной строки берете соответствующий ключ из словаря.
#!/usr/bin/env python # -*- coding: utf-8 -*- _eng_chars = u"~!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?" _rus_chars = u"ё!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ," _trans_table = dict(zip(_eng_chars, _rus_chars)) def fix_layout(s): return u''.join([_trans_table.get(c, c) for c in s])
Офлайн
reclosedevfata1exВот, делал уже такое:
Создаете словарь с отображением из латиницы в кириллицу и для каждого символа из полученной строки берете соответствующий ключ из словаря.#!/usr/bin/env python # -*- coding: utf-8 -*- _eng_chars = u"~!@#$%^&qwertyuiop[]asdfghjkl;'zxcvbnm,./QWERTYUIOP{}ASDFGHJKL:\"|ZXCVBNM<>?" _rus_chars = u"ё!\"№;%:?йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ," _trans_table = dict(zip(_eng_chars, _rus_chars)) def fix_layout(s): return u''.join([_trans_table.get(c, c) for c in s])
Офлайн
Работает, потому что у него длины одинаковые. Вставь строки себе и может и у тебя получиться.
Офлайн
odnochlenНет, тогда тоже через maketrans пробовал. В utf-8 некоторые символы больше одного байта, в этом проблема.
Работает, потому что у него длины одинаковые. Вставь строки себе и может и у тебя получиться.
In [1]: u'п'.encode('utf8') Out[1]: '\xd0\xbf'
Офлайн
igorakintevв третьем питоне нормально, там они по-другому сделаны
С maketrans не получается из-за того что разные длины получаются ну и соответственно ругается.
Офлайн