2009-07-12 44 views
19

在Python中进行编码时,是否认为通过常规字符串选择Unicode字符串是一种很好的做法?我主要工作在Windows平台上,大多数字符串类型现在都是Unicode(即.NET字符串,'_UNICODE'在默认情况下在新的C++项目中打开等)。因此,我倾向于认为使用非Unicode字符串对象的情况是一种罕见的情况。无论如何,我很好奇Python实践者在真实世界的项目中做了些什么。默认情况下,我应该使用Unicode字符串吗?

回答

17

从我的做法 - 使用unicode。

在一个项目开始时,我们使用了字符串,但是我们的项目不断增加,我们正在实施新功能并使用新的第三方库。在与非Unicode/unicode字符串混乱一些功能开始失败。我们开始花时间对这些问题进行本地化并修复它们。但是,一些第三方模块不支持unicode,并且在切换到第三方模块后开始失败(但这不是排除规则)。

另外我有一些经验,当我们需要重写某些第三方模块(例如SendKeys),因为他们不支持unicode。如果它从头开始它会更好:)

所以我认为今天我们应该使用unicode。

P.S.所有那些乱七八糟的东西只是我的讨厌看法:)

+2

+1:处理文本时总是使用unicode。每当需要将文本数据视为字节时(例如在网络上移动或写入磁盘时) - 将unicode转换为一系列字节(在Python中表示为一个字符串)。通过调用编码或unicode进行转换。 – codeape 2009-07-22 13:31:38

2

如果您处理严重受限的内存或磁盘空间,请使用ASCII字符串。在这种情况下,你应该另外编写你的软件在C或更紧凑的东西:)

13

当你问这个问题,我想你使用的是Python 2.x.

Python 3.0在字符串表示中发生了很大变化,现在所有文本都是unicode。
我会在任何新项目中使用unicode - 以与切换到Python 3.0的兼容方式(请参阅details)。

+0

是的,未来兼容性非常重要! – 2009-07-12 18:17:38

4

Mihails的附加评论我会说:使用Unicode,因为它是未来。在Python 3.0中,非Unicode将消失,并且我知道,所有的“U”-Prefixes都会遇到麻烦,因为它们也消失了。

5

它可能会非常棘手一直使用Unicode字符串在Python 2.x的 - 无论是因为有人无意中使用了更自然str(blah),他们的意思unicode(blah),忘记在字符串文字,第三方模块不兼容的u前缀 - 不管。所以在Python 2.x中,只有必须使用unicode,并准备提供良好的单元测试覆盖率。

但是,如果您可以选择使用Python 3.x,则无需关心 - 字符串将是unicode,无需额外的工作。

13

是的,使用unicode。

一些提示:

  1. 在做任何类型的二进制格式的输入输出,看完之后直接解码并直接写入之前编码,让你永远需要混合字符串和unicode。因为混音往往会导致UnicodeEncodeDecodeErrors迟早。

  2. [忘了这个,我的解释让它更加混乱。移植到Python 3只是一个问题,那么你可以关心它。]

  3. Unicode的常见Python新手错误(不是说你是新手,但这可能会被新手读取):不要混淆编码和解码。请记住,UTF-8是一种编码,因此您将Unicode编码为UTF-8和DEcode。

  4. 不要陷入在Python中设置默认编码的诱惑(通过sitecustomize.py中的setdefaultencoding或类似的方法)到最常用的任何东西。如果您重新安装或移动到另一台计算机或突然需要使用其他编码,这只会给您带来问题。明确。请记住,并不是所有的Python 2s标准库都接受unicode。如果你喂一个unicode方法,它不起作用,但它应该尝试将它喂给ascii并看看。示例:urllib.urlopen(),如果您为其提供unicode对象而不是字符串,则会失败并显示无用的错误。

嗯。这就是我现在能想到的!

+0

第3点是如此真实 - 我认识的每个人(包括我)都犯了这个错误,而不仅仅是一次! – 2009-07-12 19:05:52

相关问题