Python UnicodeDecodeError的最佳实践

时间:2010-10-14 13:56:19

标签: python unicode exception-handling pylons mako

我使用 Pylons 框架, Mako 模板作为基于Web的应用程序。我对Python处理unicode字符串的方式并没有太深入。当呈现页面时,我看到网站崩溃时出现了紧张的时刻,后来我发现它与UnicodeDecodeError有关。

看到错误之后,我开始使用Python代码添加编码,使用'ignore'选项解码字符串调用,但我仍然看不到错误。

最后,我曾经使用ignore解码为ascii并使网站运行而没有任何崩溃。

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

不是网络专家,在Python项目中处理字符串的最佳做法是什么?我是否应该只关注呈现文本或应用程序的所有阶段?

2 个答案:

答案 0 :(得分:11)

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

  • 知道您的输入编码(或使用忽略解码),并在数据到达您的应用后立即decode(encoding)
  • 仅在内部使用unicode(u'something'是unicode),也在数据库中工作
  • 用于渲染,导出等,只要它离开您的应用,encode('utf-8')数据

答案 1 :(得分:2)

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

你说

  

我不控制语言或   选择的语言。我的网站支持   国际语言和   英语。我有饲料聚合   一般不打扰   的unicode / ASCII / UTF-8

好吧,无论你选择做什么,很明显你不希望你的网络应用程序崩溃只是因为你消费的一些dø良bløgger选择用一个不起眼的斯堪的纳维亚编码方案编码他们的帖子。基本问题与所有Web应用程序相关,因为URL不包含编码信息,并且因为您永远不知道恶意用户可能想要发送给您的字节序列。在这种情况下,我做我称之为'安全链解码':我首先尝试解码为utf-8,如果这应该失败,请再次尝试使用cp1252。如果失败,我会丢弃请求(HTTP 404)或类似的东西。

你提到过程饲料和¿ ¿饲料?不要“打扰”unicode和编码。你能澄清一下这个陈述吗?它完全避开了我如何成功构建一个包含多种语言文本但不关心编码的网站。明确使用ascii-only不会让你走得很远。