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">&times;</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.