我的Python Web应用程序是否应该对所有字符串使用Unicode?

6

我看到像Django这样的框架在各个地方都使用unicode,所以似乎这可能是一个好主意。

另一方面,如果到处都有这些额外的'u',那么似乎会很麻烦。

如果我不这样做会有什么问题?

如果我这样做了,会有什么问题吗?

我现在正在使用Pylons作为我的框架。

4个回答

20

在Python 2.6中,可以通过以下方式避免使用u'':

from __future__ import unicode_literals

这将使'string literals'成为Unicode对象,就像在Python 3中一样。


+1 真遗憾不能将其与所选答案结合起来。它们都是解决此问题的“最佳”答案。 - Evan Plaice

10
在Python 3中,所有字符串都是Unicode编码。因此,你可以随时在需要的地方使用u''字符串进行准备,然后当你最终升级到Python 3并使用2to3工具时,所有的u都将消失。这样你就处于更好的位置,因为你已经用Unicode字符串测试过你的代码了。
更多信息请参见文本与数据而非Unicode与8位字节

3
如果你不使用Unicode字符串,那么你的代码将会给那些使用非A-Z字符集的国家和地区带来困扰。我们公司在使用某些网页软件时,发现如果不使用Unicode字符串,就很难处理日语字符而不出现混乱。对于英语母语者来说,了解Unicode的好处需要一点努力,但它确实是一个让计算机变得适用于所有文化和语言的极好工具。
需要注意的事项:
1. 确保你的输出网页正确声明所使用的编码(例如使用content-encoding头),并且在输出时正确编码所有的Unicode字符串。Python 3的Unicode字符串是做到这一点的一个重大改进。
2. 使用Unicode字符串进行所有操作,只有在输出时才转换为特定的编码。其他语言(如PHP)在操作Unicode时容易出现错误,例如当你需要截断Unicode字符串时,如果它在内部以UTF-8形式存在,那么就有可能会在多字节字符的中间截断,导致输出垃圾数据。Python内部使用Unicode字符串会使这些错误更难出现。

1
没错。如果你计划进行任何文本操作(例如更改大小写,将单词分割成字母),请使用Python的Unicode对象,否则你会感到痛苦。 - Marius Gedminas

1

在内部使用Unicode是避免非ASCII字符问题的好方法。在应用程序的边界处进行转换(将传入数据转换为Unicode,将传出数据转换为UTF-8或其他格式)。在许多情况下,Pylons可以为您执行转换:例如,控制器可以安全地返回Unicode字符串;SQLAlchemy模型可以声明Unicode列。

关于源代码中的字符串字面量:通常不需要使用u前缀。您可以安全地混合包含ASCII的str对象和unicode对象。只需确保所有字符串字面量都是纯ASCII或u“unicode”即可。


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