2017-10-12 78 views
8
import locale 
prefered_encoding = locale.getpreferredencoding() 
prefered_encoding 'ANSI_X3.4-1968' 

我使用了一個名爲inginious框架,它使用web.py來呈現它的模板的Apache WSGI的UnicodeDecodeError ASCII。python3默認編碼使用

web.template.render(os.path.join(root_path, dir_path), 
            globals=self._template_globals, 
            base=layout_path) 

渲染作品在我的本地不是我的臨時服務器上。

他們都運行python3。我看到web.py強制utf-8

在Python2編碼只(這是從我手中)

def __str__(self): 
    self._prepare_body() 
    if PY2: 
     return self["__body__"].encode('utf-8') 
    else: 
     return self["__body__"] 

這裏是堆棧跟蹤

t = self._template(name), 
File "/lib/python3.5/site-packages/web/template.py", line 1028, in _template, 
self._cache[name] = self._load_template(name), 
File "/lib/python3.5/site-packages/web/template.py", line 1016, in _load_template 
return Template(open(path).read(), filename=path, **self._keywords) 
File "/lib64/python3.5/encodings/ascii.py", line 26, in decode 
return codecs.ascii_decode(input, self.errors)[0] 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 83: ordinal not in range(128), 

我的HTML不包括hebew字符,小例子

<div class="modal-content"> 
        <div class="modal-header"> 
         <button type="button" class="close" data-dismiss="modal">&times;</button> 
         <h4 class="modal-title feedback-modal-title"> 
          חישוב האיברים הראשונים בסדרה של איבר ראשון חיובי ויחס שלילי: 
          <span class="red-text">אי הצלחה</span> 

我打開它像這樣:

open('/path/to/feedback.html').read() 

並且編碼失敗的行是希伯來字符的位置。

我試着在~/.bashrc設置一些環境變量:巧妙的框架下python3.5站點包安裝爲pip用戶centos

export PYTHONIOENCODING=utf8 
export LC_ALL=en_US.UTF-8 
export LANG=en_US.UTF-8 
export LANGUAGE=en_US.UTF-8 

。它的用戶下送達的Apache服務器apache

試圖在代碼中設置環境變量(應用程序的初始化過程中),這樣在Apache WSGI會意識到他們的

import os 
os.environ['LC_ALL'] = 'en_US.UTF-8' 
os.environ['LANG'] = 'en_US.UTF-8' 
os.environ['LANGUAGE'] = 'en_US.UTF-8' 

我有編輯/etc/httpd/conf/httpd.conf使用setenv方法:

SetEnv LC_ALL en_US.UTF-8 
SetEnv LANG en_US.UTF-8 
SetEnv LANGUAGE en_US.UTF-8 
SetEnv PYTHONIOENCODING utf8 

,並使用sudo service httpd restart,仍然沒有運氣重新啓動。

我的問題是,解決這個問題的最佳做法是什麼?我明白這有些瑕疵,但我想了解下劃線原因以及如何解決這個問題。

謝謝!

+0

'ANSI_X3.4-1968' =='ASCII'。 –

+0

您需要向我們展示回溯是什麼以及如何重現它。 –

+0

我已經添加了堆棧跟蹤和一些更多的代碼,但爲了重現,你將不得不安裝inginious框架,這不是一個有效的建議,所以我最好的選擇是描述問題很好 – WebQube

回答

2

終於找到了答案閱讀從

open('/path/to/feedback.html').read() 

更改的文件 時

import codecs 
with codecs.open(file_path,'r',encoding='utf8') as f: 
    text = f.read() 

如果任何人有一個,將工作更普遍的做法,我會接受他的答案

1

Python 2 + 3解決方案應該是:

import io 

with io.open(file_path, mode='r', encoding='utf8') as f: 
    text = f.read() 

請參閱io.open的文檔。