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

używam ramy nazwie inginious i to przy użyciu web.py aby uczynić swój szablon.domyślny python3 kodowania UnicodeDecodeError ASCII za pomocą apache WSGI

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

rendering działa na moim localhost ale nie na moim serwerze pomostowym.

Oba wywołują python3. Widzę, że web.py wymusza utf-8 na

kodowanie w python2 tylko (to z moich rąk)

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

tutaj jest ślad stosu

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), 

Moje html zawierają hebew znaki , mały przykład

<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> 

i otwórz go tak:

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

i linia, w której kodowanie nie powiedzie się, to miejsce, w którym znajdują się znaki hebrajskie.

Próbowałem ustawić zmienne środowiska w ~/.bashrc:

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

pod użytkownikiem centos

Pomysłowy ramy jest zainstalowany jako pip pod python3.5 site-packages. i jest obsługiwany przez serwer apache pod użytkownikiem apache

próbowano ustawienie zmiennych środowiskowych w kodzie (podczas init app), tak że WSGI apache będzie wiedział o nich

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

mam redagował /etc/httpd/conf/httpd.conf stosując metodę setenv:

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

i ponownie używając sudo service httpd restart i nadal nie ma szczęścia.

Moje pytanie brzmi: jaka jest najlepsza praktyka, aby rozwiązać ten problem. Rozumiem, że są na to hacki, ale chcę zrozumieć, co jest przyczyną podrzędną, a także jak ją rozwiązać.

Dzięki!

+0

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

+0

Musisz nam dokładnie pokazać, czym jest traceback i jak go odtworzyć. –

+0

Dodałem stacktrace i trochę więcej kodu, ale aby odtworzyć, musisz zainstalować nieistotną frameworku, co nie jest prawidłową sugestią, więc moją najlepszą opcją jest opisanie pytania dobrze – WebQube

Odpowiedz

2

wreszcie znaleźć odpowiedź podczas odczytu pliku zmieniły się od

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

do

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

jeśli ktoś ma bardziej ogólne podejście, które będą pracować, będę akceptować jego odpowiedź

1

Rozwiązanie Python 2 + 3 będzie:

import io 

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

Zobacz dokumentację z io.open.