【问题标题】:Should I use Unicode string by default?我应该默认使用 Unicode 字符串吗?
【发布时间】:2009-07-12 17:13:22
【问题描述】:

在 Python 中编码时选择 Unicode 字符串而不是常规字符串是否被认为是一种好习惯?我主要在 Windows 平台上工作,现在大多数字符串类型都是 Unicode(即 .NET 字符串、在新的 c++ 项目中默认打开“_UNICODE”等)。因此,我倾向于认为使用非 Unicode 字符串对象的情况是一种罕见的情况。无论如何,我很好奇 Python 从业者在现实世界的项目中做了什么。

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    根据我的实践——使用 unicode。

    在一个项目开始时,我们使用了通常的字符串,但是我们的项目正在增长,我们正在实施新功能并使用新的第三方库。在非 unicode/unicode 字符串的混乱中,一些函数开始失败。我们开始花时间定位这些问题并修复它们。但是,一些第三方模块不支持 unicode,并且在我们切换到它后开始失败(但这与其说是规则,不如说是排除)。

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

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

    附:所有这些乱七八糟的东西只是我的拙见:)

    【讨论】:

    • +1:处理文本时始终使用 unicode。每当需要将文本数据视为字节时(例如通过网络移动或写入磁盘时) - 将 unicode 转换为字节序列(在 Python 中表示为字符串)。通过调用encode或unicode进行转换。
    【解决方案2】:

    当您提出这个问题时,我想您使用的是 Python 2.x。

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

    【讨论】:

    • 是的,未来的兼容性很重要!
    【解决方案3】:

    是的,使用 unicode。

    一些提示:

    1. 在以任何二进制格式进行输入输出时,读取后直接解码,写入前直接编码,这样您就不需要混合字符串和 unicode。因为混合迟早会导致 UnicodeEncodeDecodeErrors。

    2. [忘掉这个吧,我的解释让它变得更加混乱。只是移植到 Python 3 时的问题,到时候你就可以关心了。]

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

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

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

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

    【讨论】:

    • 第 3 点非常正确——我认识的每个人(包括我)都犯了这个错误,而且不止一次!
    • Re:“写完后直接编码”——你能澄清一下吗?我认为应该是“之前”而不是“之后”,但我可能错过了你的意思。
    • @Lennart:“请注意,根据 Python,即使您将 unicode 编码为一个充满非 ascii 文本的字符串,这仍然是文本。” ...在 3.x 中, str.encode() 返回类型字节,ascii 与否的区别似乎无关紧要;你想表达什么意思?
    • @ars:正确,已修复。 @John:嗯,我想我只会让事情变得更混乱。这不是重点,所以我删除了它。
    • @Lennart:默认生成 UTF-8 输出会有什么问题?这比在不同平台上做不同事情的程序要好得多。如果人们不喜欢 UTF-8,他们可以通过 iconv 进行管道传输。当程序一直在做同样的事情时,它会更可靠。我编写的每个程序,无论是 Perl、Python 还是 Java,总是强制标准输入和标准输出为 UTF-8(但接受来自环境的覆盖)。我简直无法忍受默认平台编码搞砸你的方式。
    【解决方案4】:

    在 Python 2.x 中始终使用 unicode 字符串可能会很棘手——因为有人无意中使用了更自然的 str(blah),他们的意思是 unicode(blah),忘记了字符串文字上的 u 前缀,第三方模块不兼容 - 无论如何。因此,在 Python 2.x 中,仅在必要时才使用 unicode,并准备好提供良好的单元测试覆盖率。

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

    【讨论】:

      【解决方案5】:

      除了 Mihails 的评论之外,我想说:使用 Unicode,因为它是未来。在 Python 3.0 中,非 Unicode 将消失,据我所知,所有的“U”前缀都会带来麻烦,因为它们也消失了。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-14
          • 2013-04-24
          • 1970-01-01
          相关资源
          最近更新 更多