Python 默认情况下我应该使用Unicode字符串吗?

Python 默认情况下我应该使用Unicode字符串吗?,python,unicode,Python,Unicode,在用Python编码时,选择Unicode字符串而不是常规字符串是否被认为是一种好的做法?我主要工作在Windows平台上,其中大部分的字符串类型是Unicode,这些天(即.NET字符串,'Unicode)在新C++项目上默认启动)。因此,我倾向于认为使用非Unicode字符串对象的情况是一种罕见的情况。无论如何,我很好奇Python实践者在现实项目中做什么 根据我的实践——使用unicode 在一个项目开始时,我们使用了usuall字符串,然而我们的项目在不断发展,我们正在实现新的特性并使用

在用Python编码时,选择Unicode字符串而不是常规字符串是否被认为是一种好的做法?我主要工作在Windows平台上,其中大部分的字符串类型是Unicode,这些天(即.NET字符串,'Unicode)在新C++项目上默认启动)。因此,我倾向于认为使用非Unicode字符串对象的情况是一种罕见的情况。无论如何,我很好奇Python实践者在现实项目中做什么

根据我的实践——使用unicode

在一个项目开始时,我们使用了usuall字符串,然而我们的项目在不断发展,我们正在实现新的特性并使用新的第三方库。在非unicode/unicode字符串的混乱中,一些函数开始失败。我们开始花时间解决这些问题。然而,一些第三方模块不支持unicode,在我们切换到unicode后开始出现故障(但这是一种排除而非规则)

我也有一些经验,当我们需要重写一些第三方模块(例如SendKeys)时,因为它们不支持unicode。如果从一开始就用unicode完成,会更好:)

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


另外,所有这些乱七八糟的东西只是我的观点:)

如果你处理的是严重受限的内存或磁盘空间,请使用ASCII字符串。在这种情况下,您还应该用C或更简洁的语言编写软件:)

当您问这个问题时,我想您使用的是Python2.x

Python 3.0在字符串表示法方面有了很大的变化,现在所有的文本都是unicode。

在任何新项目中,我都会选择unicode——以一种与转换到Python 3.0兼容的方式(请参阅)。

除了Mihail的评论之外,我会说:使用unicode,因为它是未来。在Python3.0中,非Unicode将不复存在,据我所知,所有的“U”前缀都将带来麻烦,因为它们也不复存在。

在Python2.x中一致使用Unicode字符串可能会很棘手-可能是因为有人无意中使用了更自然的
str(blah)
,它们的意思是
Unicode(blah)
,忘记字符串文本的
u
前缀,第三方模块不兼容-不管怎样。因此,在Python2.x中,只有在必要时才使用unicode,并且准备提供良好的单元测试覆盖率

但是,如果您可以选择使用Python3.x,则无需担心-字符串将是unicode,无需额外努力。

是的,使用unicode

一些提示:

  • 当以任何类型的二进制格式进行输入输出时,在读取后直接解码,在写入前直接编码,这样就不需要混合使用字符串和unicode。因为这种混合迟早会导致单基因突变

  • [忘了这一点,我的解释只是让它更加混乱。这只是移植到Python 3时的一个问题,您可以考虑一下。]

  • Unicode中常见的Python新手错误(并不是说你是新手,但这可能会被新手读懂):不要混淆编码和解码。请记住,UTF-8是一种编码,所以您可以将Unicode编码为UTF-8并从中解码

  • 不要陷入将Python中的默认编码(通过sitecustomize.py或类似文件中的setdefaultencoding)设置为您最常用的编码的诱惑中。如果您重新安装或移动到另一台计算机,或者突然需要使用另一种编码,这只会给您带来问题。要明确

  • 请记住,并非所有Python 2s标准库都接受unicode。如果您输入一个unicode方法,但该方法不起作用,请尝试输入ascii并查看。示例:urllib.urlopen(),如果您给它一个unicode对象而不是字符串,它将失败,并出现无用的错误


  • 嗯,这就是我现在能想到的

    是的,未来的兼容性非常重要!第三点是如此真实——我认识的每个人(包括我)都犯了这个错误,而且不止一次!回复:“写后直接编码”——你能澄清一下吗?我认为应该是“before”而不是“after”,但我可能没有抓住你的重点。@Lennart:“请注意,根据Python的说法,即使你将unicode编码成一个充满非ascii文本的字符串,这仍然是文本。”。。。在3.x中,str.encode()返回类型字节,ascii与否的区别似乎无关紧要;你想表达的意思是什么?@ars:对,修正了@约翰:嗯,我想我只是把事情弄得更混乱了。这不是重点,所以我删除了它。@Lennart:默认情况下生成UTF-8输出会有什么问题?这比在不同平台上做不同事情的程序要好得多。如果人们不喜欢UTF-8,他们可以通过iconv来传输信息。当程序总是做同样的事情时,它会更可靠。我编写的每个程序,无论是Perl、Python还是Java,都会将stdin和stdout强制为UTF-8(但接受来自环境的覆盖)。我简直无法忍受默认平台编码让你发疯的方式。+1:在处理文本时始终使用unicode。每当需要将文本数据视为字节时(例如,在网络上移动或写入磁盘时)——将unicode转换为字节序列(在Python中表示为字符串)。通过调用encode或unicode进行转换。