【问题标题】:Best Practices for Python UnicodeDecodeErrorPython UnicodeDecodeError 的最佳实践
【发布时间】:2011-04-25 10:29:14
【问题描述】:

我使用 Pylons 框架,Mako 模板用于基于 Web 的应用程序。我对 Python 处理 unicode 字符串的方式并没有太在意。当我在页面渲染时确实看到我的网站崩溃时,我有紧张的时刻,后来我才知道它与UnicodeDecodeError有关。

看到错误后,我开始围绕我的 Python 代码添加编码,使用“忽略”选项对字符串进行解码调用,但有时我仍然看不到错误消失。

最后我用ignore解码为ascii并让网站运行没有任何崩溃。

我的网站的输入来自许多网站。这意味着我无法控制语言或选择的语言。我的网站支持国际语言和英语。我有提要聚合,通常不关心 unicode/ascii/utf-8。当我通过 mako 模板显示文本时,我按原样显示。

不是网络专家,在 Python 项目中处理字符串的最佳实践是什么?我应该只在渲染文本时关心还是在应用程序的所有阶段关心?

【问题讨论】:

    标签: python unicode exception-handling pylons mako


    【解决方案1】:

    这对你来说可能不是一个可行的选择,但是让我说,在使用 python 3 时,大量与编码相关的错误消失了,只是因为 unicode 字符串和字节对象之间的分离变得更加清晰。当我必须使用 python 2 时,我选择 2.6 版,您可以在其中声明 from future import unicode_literals。不信的人实际上应该阅读the link you posted,因为它指出了 Python 的编码/解码行为的一些微妙之处,幸运的是在 Python 3 中消失了。

    你说

    我不控制语言或 选择的语言。我的网站支持 国际语言并与 英语。我有饲料聚合 一般不会在意 unicode/ascii/utf-8

    好吧,无论您选择做什么,很明显您不希望您的 Web 应用程序崩溃,因为您使用的某些 dænish bløgger 的提要选择以一种不起眼的斯堪的纳维亚编码方案对他们的帖子进行编码。根本问题与所有 Web 应用程序有关,因为 URL 不携带编码信息,而且您永远不知道恶意用户可能想要发送给您的字节序列。在这种情况下,我执行我所说的“安全链解码”:我首先尝试解码为 utf-8,如果失败,请使用 cp1252 重试。如果失败,我会丢弃请求(HTTP 404)或类似的东西。

    你提到你处理提要和¿你? ¿提要?不要“打扰” unicode 和编码。你能澄清一下这个说法吗?它完全避开了我如何成功地构建一个包含多种语言文本而不关心编码的网站。显然只使用 ascii 不会让你走得太远。

    【讨论】:

    • +1 一个很好的答案,所以在读取文件时总是先解码,对吧?如果 txt 文件不提供编码,我怎么知道?
    【解决方案2】:

    如果你对它有影响,这是无痛的方式:

    • 知道您的输入编码(或忽略解码)和decode(encoding) 数据一进入您的应用程序
    • 只能在内部使用 unicode(u'something' 是 unicode),也在数据库中
    • 用于渲染、导出等,无论何时离开您的应用,encode('utf-8') 数据

    【讨论】:

      猜你喜欢
      • 2014-03-02
      • 1970-01-01
      • 2018-11-09
      • 2016-03-10
      • 2011-07-11
      • 2021-10-14
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多