import locale
prefered_encoding = locale.getpreferredencoding()
prefered_encoding 'ANSI_X3.4-1968'
我正在使用一个名为"inginious"的框架,它使用"web.py"来渲染模板。请参考inginious 和 web.py 了解更多信息。
web.template.render(os.path.join(root_path, dir_path),
globals=self._template_globals,
base=layout_path)
渲染在我的本地主机上可以正常工作,但在我的暂存服务器上无法正常工作。
它们都运行python3。我发现web.py只在Python2中强制执行utf-8编码(这不在我的控制范围内)。
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包含希伯来字符,以下是一个小例子:
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title feedback-modal-title">
חישוב האיברים הראשונים בסדרה של איבר ראשון חיובי ויחס שלילי:
<span class="red-text">אי הצלחה</span>
我这样打开它:
open('/path/to/feedback.html').read()
编码失败的那一行是包含希伯来字符的那一行。
我尝试在~/.bashrc
中设置了一些环境变量:
export PYTHONIOENCODING=utf8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
在用户centos
下:
巧妙的框架安装在python3.5 site-packages下的pip
中,并由用户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'
我使用setenv方法编辑了/etc/httpd/conf/httpd.conf
文件:
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
来重新启动,但仍然没有成功。
我的问题是,最佳实践是什么?我知道有一些hack的方法,但我想要了解根本原因以及如何解决。
谢谢!
ANSI_X3.4-1968
等同于ASCII
。 - Martijn Pietersweb.py
,转而使用 Flask 或 Django(它们的模板处理在真正的 Python 3 部署中更加经过考验)。 - Martijn Pieters