【问题标题】:Python 2: Comparing a unicode and a strPython 2:比较 unicode 和 str
【发布时间】:2015-10-19 21:08:41
【问题描述】:

这个话题已经在 StackOverflow 上,但是我没有找到任何令人满意的解决方案:

我有一些来自服务器的 Unicode 字符串,我在代码中有一些我想匹配的硬编码字符串。而且我确实理解为什么我不能只制作 == 但我没有成功正确转换它们(我不在乎我是否必须做 str -> unicode 或 unicode -> str)。

我尝试了encodedecode,但没有给出任何结果。

这是我收到的...

fromServer = {unicode} u'Führerschein nötig'
fromCode = {str} 'Führerschein nötig'

(如您所见,它是德语!)

如何在 Python 2 中让它们相等?

【问题讨论】:

  • 为什么不在代码中也用 unicode 硬编码呢? fromCode = u'Führerschein nötig' 而不是 fromCode = 'Führerschein nötig'?
  • 哈哈哈,是的,当然还不错,是一个解决方案,当然.... :DD

标签: python unicode encoding character-encoding python-2.x


【解决方案1】:

首先确保在文件顶部声明 Python 源文件的编码。例如。如果您的文件编码为 latin-1:

# -*- coding: latin-1 -*-

其次,始终将文本存储为 Unicode 字符串:

fromCode = u'Führerschein nötig'

如果您从某个地方获取字节,请在处理文本之前使用 str.decode 将它们转换为 Unicode。对于文本文件,在打开文件时指定编码,例如:

# use codecs.open to open a text file
f = codecs.open('unicode.rst', encoding='utf-8')

将字节字符串与 Unicode 字符串进行比较的代码通常会随机失败,具体取决于系统设置或文本文件使用的任何编码。不要依赖它,始终确保您比较两个 unicode 字符串或两个字节字符串。

Python 3 改变了这种行为,它不会尝试转换任何字符串。 'a'b'a' 被视为不同类型的对象,比较它们将始终返回 False

【讨论】:

    【解决方案2】:
    tested on 2.7
    
    for German umlauts latin-1 is used.
    
    if 'Führerschein nötig'.decode('latin-1') == u'Führerschein nötig':
        print('yes....')
    
    yes....
    

    【讨论】:

    • 是的,我得到local = criteria['key'].encode('utf-8') UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 14: ordinal not in range(128)
    • @LaurentMeyer 我从来没有怀疑过你 Laurent :)。有些人不知道变音符号是什么,他们只是羡慕 :) 好在现在我们知道在 python 2 上如何比较这两种类型的字符串。我想在其中一个上运行解码对你来说没有问题。
    • @LetzerWille,你知道你的代码在做什么吗?
    • 这只有在 源文件latin-1 编码保存时才有效。如果源文件以 UTF-8 保存,它将失败。这不是解决方案。使用 Unicode 常量,或者如果您从文件或其他 I/O 流等源读取字节字符串,.decode 使用其已知编码的字节字符串。
    • 这是一个非常脆弱的解决方案。有关 Python 中 Unicode 支持的介绍,请阅读docs.python.org/2/howto/unicode.html
    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多