python3 кодировка по умолчанию UnicodeDecodeError ascii с использованием apache WSGI
import locale
prefered_encoding = locale.getpreferredencoding()
prefered_encoding 'ANSI_X3.4-1968'
я использую фреймворк под названием inginious и с помощью web.py для отображения шаблона.
web.template.render(os.path.join(root_path, dir_path),
globals=self._template_globals,
base=layout_path)
визуализация работает на моем localhost в но не на моем промежуточном сервере.
они оба работают python3. Я вижу, что web.py применяет utf-8
on
кодировка только в Python2 (это не в моих руках)
def __str__(self):
self._prepare_body()
if PY2:
return self["__body__"].encode('utf-8')
else:
return self["__body__"]
вот стек Трейс!--21-->
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">×</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
под
оригинальный фреймворк устанавливается как pip
под python3.5 сайтов-пакетов. и его обслуживал Апач сервер под пользователем 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
и все равно не повезло.
мой вопрос в том, какая лучшая практика для решения этой проблемы. Я понимаю, что для этого есть хаки, но я хочу понять в чем причина подчеркивания, а также как ее решить.
спасибо!
2 ответов
наконец-то нашел ответ при чтении файла изменено с
open('/path/to/feedback.html').read()
to
import codecs
with codecs.open(file_path,'r',encoding='utf8') as f:
text = f.read()
Если у кого-то есть более общий подход, который будет работать, я приму его ответ
решение Python 2+3 будет:
import io
with io.open(file_path, mode='r', encoding='utf8') as f:
text = f.read()
см. документацию io.open
.