【问题标题】:python3 default encoding UnicodeDecodeError ascii using apache WSGIpython3默认编码UnicodeDecodeError ascii使用apache WSGI
【发布时间】:2018-03-24 00:20:35
【问题描述】:
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)

渲染在我的本地主机上工作,但不在我的登台服务器上

它们都运行 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中设置一些环境变量:

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

用户centos

巧妙的框架安装为pip在python3.5站点包下。它由用户 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 重新启动,但仍然没有运气。

我的问题是,解决这个问题的最佳做法是什么。我知道这有一些技巧,但我想了解下划线的原因是什么以及如何解决它。

谢谢!

【问题讨论】:

  • ANSI_X3.4-1968 == ASCII.
  • 您需要准确地向我们展示回溯是什么以及如何重现它。
  • 我添加了堆栈跟踪和更多代码,但为了重现,您必须安装巧妙的框架,这不是一个有效的建议,所以我最好的选择是描述好好提问
  • 呸,web.py 不能很好地处理读取模板文件,它应该真正明确地说明它们的编码。坦率地说,这是相当愚蠢的。我想你可以通过对非 ASCII 文本使用 HTML 实体来解决这个问题,但我个人的建议是远离 web.py 并改为使用 Flask 或 Django(模板处理在真实环境中更加久经沙场) Python 3 部署)。
  • @MartijnPieters,这与我的范围无关。我在没有任何运气的情况下探索了环境变量范围内的解决方案。表面上看,它可以在我的本地主机上运行。请从问题中删除保留,我认为这是一个非常有效的问题。

标签: python apache encoding utf-8 web.py


【解决方案1】:

终于在读取文件的时候找到了答案 从

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

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

如果有人有更通用的方法可行,我会接受他的回答

【讨论】:

  • 嗯,不完全是。在 python3 中,“在文本模式下,如果未指定编码,则使用的编码取决于平台:调用 locale.getpreferredencoding(False) 以获取当前的语言环境编码。”换句话说,您在上面所做的将起作用,但真正的问题是 locale.getpreferredencoding(False) 没有像您希望的那样返回 utf-8。这是from the python3 docs
【解决方案2】:

Python 2+3 解决方案是:

import io

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

查看io.open的文档。

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 2014-04-22
    • 2016-06-27
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多