2017-10-16 69 views
1

在我的Django項目中,我使用了字段(「title」)。在這個領域中,用戶需要用俄語書寫,但用戶可能會誤寫一些拉丁字母。我想改變它們。我用PYTHON 2.7。下一個代碼引發錯誤。如何解決這個錯誤?如何將文本中的字母改爲其他字母| 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) 
+0

從你的函數定義中刪除自己。 –

+0

線索在'maketrans()需要2個參數(1給出)' - 請參見[string.maketrans(from,to)](https://docs.python.org/2/library/string.html#string .maketrans) –

+0

當我使用form.cleaned_data ['title']。translate(maketrans(eng,rus))'它會引發錯誤'UnicodeEncodeError:'ascii'編解碼器不能編碼0-21位置的字符:ordinal不在範圍內(128)'。你有什麼想法嗎? –

回答

1

您可以手動像這樣做:

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。所有映射的拉丁到西里爾都將被替換。請注意,映射中的所有內容都是unicode。如果把翻譯字符串的Django引發UnicodeDecode /編碼錯誤,這意味着你應該先試:

a_string = a_string.encode("utf-8", "ignore") 

UTF-8二進制應該被接受。

2

這會讓事情變得更簡單,如果你在你的代碼中使用Unicode文本同樣,這樣你就不必擔心str vs unicode類型問題。這與將所有字符串文字寫爲u'stuff'而不僅僅是'stuff'相同。

下一頁 - 的unicodestringtranslate功能需要不同的參數 - 你需要一個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 
+0

你好!我試圖測試你的代碼,但不幸的是它不爲我工作。你的代碼不會引發錯誤,但它不會將拉丁字母改爲西里爾文。你還有其他建議嗎? –

相關問題