Как изменить буквы в тексте на другие буквы | Python 2.7?
В моем проекте Django у меня есть форма с полем ("title"). В этом поле пользователь должен писать на русском языке, но пользователь может по ошибке написать несколько латинских букв. Я хочу изменить их. Я использую PYTHON 2.7. Следующая ошибка поднятия кода. Как исправить эту ошибку?
from string import maketrans
eng = 'ETOPAHKXCBMetopahkxcbm' # English letters
rus = 'ЕТОРАНКХСВМеторанкхсвм' # Russian letters
def form_valid(self, form):
form.cleaned_data['title'].translate(maketrans(dict(zip(eng, rus))))
form.save()
ОШИБКА:
Traceback (most recent call last):
File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/edit.py", line 217, in post
return super(BaseCreateView, self).post(request, *args, **kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/edit.py", line 183, in post
return self.form_valid(form)
File "/home/nurzhan/dashboard.kase.kz/static_pages/views.py", line 54, in form_valid
form.cleaned_data['title'].translate(maketrans(dict(zip(eng, rus))))
TypeError: maketrans() takes exactly 2 arguments (1 given)
Когда я использую только form.cleaned_data['title'].translate(maketrans(eng, rus))
это поднимает ошибку:
Internal Server Error: /static_page/create/
Traceback (most recent call last):
File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/srv/envs/py27/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
return handler(request, *args, **kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/edit.py", line 217, in post
return super(BaseCreateView, self).post(request, *args, **kwargs)
File "/srv/envs/py27/lib/python2.7/site-packages/django/views/generic/edit.py", line 183, in post
return self.form_valid(form)
File "/home/nurzhan/dashboard.kase.kz/static_pages/views.py", line 54, in form_valid
form.cleaned_data['title'].translate(maketrans(eng, rus))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-21: ordinal not in range(128)
2 ответа
Вы можете сделать это вручную следующим образом:
a_string = u"abcdeFghijklmn" # Let say it is cyrillic with one latin letter represented here by 'F' (uppercase)
# To change it to cyrillic i.e. here to lower latin you would do:
l2c = {u"F": u"f"} # Map all latin to cyrillic for real
l2c_get = l2c.get # Faster access but not necessary
a_string = u"".join(
l2c_get(x, x) for x in a_string)
Конечно, вы можете использовать метод unicode.translate(), который должен делать то же самое.
Когда ваша строка 'a_string' обработана, просто верните ее в django. Все сопоставленные латиницы на кириллицу будут заменены. Просто обратите внимание, что в отображении все в юникоде. Если перевод переведенной строки в django вызывает ошибку UnicodeDecode/Encode, это означает, что вам следует прежде чем попробовать:
a_string = a_string.encode("utf-8", "ignore")
UTF-8 в двоичном коде должен быть принят.
Будет немного проще, если вы будете использовать литералы Unicode в своем коде, так что вам придется меньше беспокоиться о str
против unicode
тип вопросов. Это то же самое, что написать все ваши строковые литералы как u'stuff'
вместо просто 'stuff'
,
Далее - translate
функция unicode
и из string
принимать разные аргументы - вам нужно dict
для отображения Unicode с порядковыми номерами Unicode в порядковые номера или строки Unicode, а не maketrans
который предназначен только для str
переводы.
Вы можете использовать ord
встроенный, чтобы получить ординалы от ваших символов Unicode.
Попробуй это:
from __future__ import unicode_literals # Put this at the top of your source
eng = 'ETOPAHKXCBMetopahkxcbm' # English letters
rus = 'ЕТОРАНКХСВМеторанкхсвм' # Russian letters
table = dict(zip(map(ord, eng), map(ord, rus)))
assert eng.translate(table) == rus # Verifying translation