Python UnicodeDecodeError 的最佳实践

5
我使用 Pylons 框架,Mako 模板来开发基于web的应用程序。我并没有深入了解Python如何处理Unicode字符串。当我看到网页渲染时出现UnicodeDecodeError错误导致网站崩溃时,我非常紧张。
看到这个错误后,我开始在我的Python代码中添加编码、解码调用,使用“忽略”选项对字符串进行处理,但有时错误仍然无法消除。
最终,我选择使用忽略方式将其解码为ASCII码,并使网站在没有任何崩溃的情况下运行。
我的网站的输入来自许多不同的网站。这意味着我不能控制语言或语言选择。我的网站支持国际语言和英语。我有一个提要聚合器,通常不会关心Unicode/ASCII/UTF-8。当我通过Mako模板显示文本时,我按原样显示。
作为一个非web专家,在Python项目中处理字符串的最佳实践是什么?我应该只在渲染文本时关注还是整个应用程序的所有阶段都需要关注?
2个回答

11

如果您能对此进行影响,这是一种无痛的方法:

  • 了解您的输入编码(或使用 ignore 进行解码),并在数据到达您的应用程序时立即使用 decode(encoding) 进行解码
  • 仅在应用程序内部使用 Unicode(u'something' 是 Unicode),包括数据库
  • 在导出等情况下,每当数据离开您的应用程序时,encode('utf-8') 编码数据

2
这可能不是您的可行选项,但我想说,在使用Python 3时,许多与编码有关的错误都会消失,因为Unicode字符串和字节对象之间的区分变得更加清晰。当我必须使用Python 2时,我选择版本2.6,在那里你可以声明from future import unicode_literals。对于怀疑者,实际上应该阅读您发布的链接,因为它指出了Python的编码/解码行为中的一些微妙之处,这在Python 3中幸运地消失了。
您说:

我无法控制语言或所选择的语言。我的网站支持国际语言以及英语。我有一个提供Feed聚合的功能,通常不需要担心Unicode / ASCII / UTF-8。

无论你选择做什么,显然你不希望你的网络应用程序因为某个你消费其提要的丹麦博客人物选择使用一个晦涩的斯堪的纳维亚编码方案来编码他们的文章而崩溃。这个潜在问题与所有网络应用程序相关,因为URL不携带编码信息,并且因为你永远不知道恶意用户可能想发送给你的字节序列是什么。在这种情况下,我所做的是“安全链解码”:首先尝试使用UTF-8解码,如果失败了,则再次尝试使用CP1252。如果这也失败了,则丢弃请求(HTTP 404)或类似的操作。
你提到你处理提要,但是“你”或“提要”并不关心Unicode和编码。你能澄清一下这个声明吗?我完全不明白如何成功构建一个包含多种语言文本的站点而不关心编码。显然,仅使用ASCII将无法使你走得太远。

+1 很好的答案,所以在读取文件时总是先进行解码,对吧?如果一个文本文件没有提供编码,我怎么知道呢? - Phyo Arkar Lwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接