【发布时间】:2009-07-12 17:13:22
【问题描述】:
在 Python 中编码时选择 Unicode 字符串而不是常规字符串是否被认为是一种好习惯?我主要在 Windows 平台上工作,现在大多数字符串类型都是 Unicode(即 .NET 字符串、在新的 c++ 项目中默认打开“_UNICODE”等)。因此,我倾向于认为使用非 Unicode 字符串对象的情况是一种罕见的情况。无论如何,我很好奇 Python 从业者在现实世界的项目中做了什么。
【问题讨论】:
在 Python 中编码时选择 Unicode 字符串而不是常规字符串是否被认为是一种好习惯?我主要在 Windows 平台上工作,现在大多数字符串类型都是 Unicode(即 .NET 字符串、在新的 c++ 项目中默认打开“_UNICODE”等)。因此,我倾向于认为使用非 Unicode 字符串对象的情况是一种罕见的情况。无论如何,我很好奇 Python 从业者在现实世界的项目中做了什么。
【问题讨论】:
根据我的实践——使用 unicode。
在一个项目开始时,我们使用了通常的字符串,但是我们的项目正在增长,我们正在实施新功能并使用新的第三方库。在非 unicode/unicode 字符串的混乱中,一些函数开始失败。我们开始花时间定位这些问题并修复它们。但是,一些第三方模块不支持 unicode,并且在我们切换到它后开始失败(但这与其说是规则,不如说是排除)。
当我们需要重写一些第三方模块(例如 SendKeys)时,我也有一些经验,因为它们不支持 unicode。如果从一开始就用 unicode 完成会更好:)
所以我认为今天我们应该使用 unicode。
附:所有这些乱七八糟的东西只是我的拙见:)
【讨论】:
当您提出这个问题时,我想您使用的是 Python 2.x。
Python 3.0 在字符串表示方面发生了很大变化,现在所有文本都是 unicode。
我会在任何新项目中使用 unicode - 以与切换到 Python 3.0 兼容的方式(参见 details)。
【讨论】:
是的,使用 unicode。
一些提示:
在以任何二进制格式进行输入输出时,读取后直接解码,写入前直接编码,这样您就不需要混合字符串和 unicode。因为混合迟早会导致 UnicodeEncodeDecodeErrors。
[忘掉这个吧,我的解释让它变得更加混乱。只是移植到 Python 3 时的问题,到时候你就可以关心了。]
使用 Unicode 的常见 Python 新手错误(不是说你是新手,但这可能会被新手阅读):不要混淆编码和解码。请记住,UTF-8 是一种编码,因此您将 Unicode 编码为 UTF-8 并从中解码。
不要陷入将 Python 中的默认编码(通过 sitecustomize.py 或类似文件中的 setdefaultencoding)设置为您最常用的任何内容的诱惑。如果您重新安装或移动到另一台计算机或突然需要使用另一种编码,那只会给您带来问题。明确。
请记住,并非所有 Python 2s 标准库都接受 unicode。如果你输入一个方法 unicode 并且它不起作用,但它应该,尝试输入它 ascii 并查看。示例:urllib.urlopen(),如果你给它一个 unicode 对象而不是一个字符串,它会失败并出现无用的错误。
嗯。我现在能想到的就这些了!
【讨论】:
在 Python 2.x 中始终使用 unicode 字符串可能会很棘手——因为有人无意中使用了更自然的 str(blah),他们的意思是 unicode(blah),忘记了字符串文字上的 u 前缀,第三方模块不兼容 - 无论如何。因此,在 Python 2.x 中,仅在必要时才使用 unicode,并准备好提供良好的单元测试覆盖率。
但是,如果您可以选择使用 Python 3.x,则无需担心 - 字符串将是 unicode,无需额外的努力。
【讨论】:
除了 Mihails 的评论之外,我想说:使用 Unicode,因为它是未来。在 Python 3.0 中,非 Unicode 将消失,据我所知,所有的“U”前缀都会带来麻烦,因为它们也消失了。
【讨论】:
如果您正在处理严重受限的内存或磁盘空间,请使用 ASCII 字符串。在这种情况下,您应该另外用 C 或更紧凑的方式编写您的软件 :)
【讨论】: