【发布时间】:2010-10-24 01:37:04
【问题描述】:
我看到一些框架,比如 Django,到处都在使用 unicode,所以这似乎是个好主意。
另一方面,让所有这些额外的 'u' 到处飘荡似乎是一种巨大的痛苦。
如果我不这样做会有什么问题?
如果我这样做会出现什么问题吗?
我现在使用 Pylons 作为我的框架。
【问题讨论】:
标签: python django web-applications unicode pylons
我看到一些框架,比如 Django,到处都在使用 unicode,所以这似乎是个好主意。
另一方面,让所有这些额外的 'u' 到处飘荡似乎是一种巨大的痛苦。
如果我不这样做会有什么问题?
如果我这样做会出现什么问题吗?
我现在使用 Pylons 作为我的框架。
【问题讨论】:
标签: python django web-applications unicode pylons
在 Python 3 中,所有字符串都是 Unicode。因此,您可以在需要的任何地方使用u'' 字符串为此做好准备,然后当您最终使用2to3 工具升级到Python 3 时,所有us 都会消失。而且您将处于更好的位置,因为您已经使用 Unicode 字符串测试了您的代码。
【讨论】:
您可以在 python 2.6 中避免u'',方法是:
from __future__ import unicode_literals
这将使'string literals' 成为 unicode 对象,就像在 python 3 中一样;
【讨论】:
如果我不这样做会有什么问题?
我是居住在日本的西方人,所以我亲眼目睹了使用非 ASCII 字符需要什么。如果你不使用 Unicode 字符串,问题是你的代码会让世界上那些使用 A-Z 以外的任何东西的人感到沮丧。我们公司在让某些网络软件不把它弄得一团糟的情况下,让某些网络软件写出日文字符而感到非常沮丧。
说英语的人需要花一点力气才能体会到 Unicode 的伟大之处,但要让计算机能够兼容所有文化和语言确实是一项了不起的工作。
“陷阱”:
确保您的输出网页说明正确使用的编码(例如,使用内容编码标头),然后在输出时正确编码所有 Unicode 字符串。 Python 3 Unicode 字符串是一个很好的改进。
使用 Unicode 字符串执行所有操作,并且仅在最后一刻进行输出时转换为特定编码。其他语言(例如 PHP)在处理 Unicode 时容易出现错误,例如UTF-8 格式。假设您必须截断 Unicode 字符串。如果它在内部采用 UTF-8 格式,则存在中途截断多字节字符的风险,从而导致垃圾输出。 Python 在内部使用 Unicode 字符串使得这些错误更难犯。
【讨论】:
在内部使用 Unicode 是避免非 ASCII 字符问题的好方法。在应用程序的边界进行转换(将传入数据转换为 unicode,将传出数据转换为 UTF-8 或其他)。在许多情况下,Pylons 可以为您进行转换:例如控制器可以安全地返回 unicode 字符串; SQLAlchemy 模型可以声明 Unicode 列。
关于源代码中的字符串文字:通常不需要 u 前缀。您可以安全地将包含 ASCII 的 str 对象与 unicode 对象混合。只需确保所有字符串文字都是纯 ASCII 或 u"unicode"。
【讨论】: