【问题标题】:Why are these strings that look the same, treated differently by code? [duplicate]为什么这些看起来一样的字符串,却被代码区别对待? [复制]
【发布时间】:2019-11-30 23:08:10
【问题描述】:

我正在使用 Python 创建一些带有 unicode 文本的文件,并将内容保存在 sqlite3 DB 中。后来,我获取了这些文件并进行了一些更改。问题是 Python 不认为这两个字符串是相同的,即使它们看起来一样。

这是一个例子:

Str1 : "Copa América 2019"
Str2 : "Copa América 2019"

虽然这两个字符串看起来完全一样,但程序不会将它们视为相同。

我在其他语言(韩语、日语等)中也看到了相同的行为,因此在这里选择了法语示例,因为它对我来说更容易阅读。韩文/日文我根据字符的外观匹配字符。

我也在网上进行了比较(例如https://www.quickdiff.com/)并发现了相同的结果...所以它不是特定于 Python 的,而是其他一些问题。

我可以对字符串执行什么操作,以便代码将这两个字符串视为相同?

尝试单独显式转换为 str / utf-8 编码,但无济于事。

a = "Copa América 2019"
b = "Copa América 2019"
if a == b:
    print 'y'

type(a)
    <type 'str'>
type(b)
    <type 'str'>

我希望这些字符串的字符串比较结果为 True。

【问题讨论】:

  • Unicode 可以用不同的方式编码像é 这样的字符。检查len(a)len(b)。您可以尝试规范化两个字符串:stackoverflow.com/questions/16467479/normalizing-unicode
  • 谢谢。是的,它们是不同的。 len(a) = 18; len(b) = 19。我无法理解的是如何解决这个问题。我试过 b1=b.encode('utf-8') 和 a1=a.encode('utf-8'),但它们也不同(当然,因为它们是不同的字符)。
  • 'Copa Ame\xcc\x81rica 2019''Copa Am\xc3\xa9rica 2019'
  • 更新:规范化似乎工作正常:repl.it/repls/RepentantRepulsiveHandwritingrecognition

标签: python string unicode utf-8 compare


【解决方案1】:

@Blorgbeard 答案的完整演示。

import unicodedata

a = "é"
b = "é"

print(len(a)) # 1
print(len(b)) # 2

print(len(unicodedata.normalize("NFC", a))) # 1
print(len(unicodedata.normalize("NFC", b))) # 1

print(len(unicodedata.normalize("NFD", a))) # 2
print(len(unicodedata.normalize("NFD", b))) # 2

此问题可能会被标记为重复问题,请留在这里以防万一。

【讨论】:

  • 非常感谢!我通常擅长寻找类似的问题,但看起来在这种情况下我真的不知道要搜索什么。这解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2021-07-18
  • 2019-09-04
  • 2015-08-03
  • 2012-09-27
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多