汉字比较 returning false 应该 return true

Chinese character comparison returning false when it should return true

我正在对两个从 UTF-8 正确解码(我认为)的汉字进行简单的字符串比较,但是,结果仍然不相等,我一直无法弄清楚原因。一个字符是从输入文件中读取的,另一个是从解码的 EPUB 书中读取的。

我试过的:

代码

读取我获取要比较的字符的文件:

with open(input_file_name, encoding="utf-8") as input_file:

在这种情况下,文件是单行字符:子

阅读电子书,然后尝试找到角色:

book = epub.read_epub(args.ebook_path)

for doc in book.get_items_of_type(ebooklib.ITEM_DOCUMENT):
    content = doc.content.decode('utf-8')
    print(content)
    if word in content:
        print("MATCH FOUND")
        break

从上面的代码可以看出我正在打印书中每一项的内容。该输出的一部分包括:

<td class="b_cell1" width="90%"><p class="p_index_">zǐ 子</p>

字符清晰出现的地方。

如我所料

我希望这两个字符匹配。但是,如果我将代码更改为:

word = '子'

for doc in book.get_items_of_type(ebooklib.ITEM_DOCUMENT):
    content = doc.content.decode('utf-8')
    print(content)
    if word in content:
        print("MATCH FOUND")
        break

它将打印 MATCH FOUND 并适当地找到字符。如果我检查从文件中读取的字符的二进制值和上面显示的覆盖字:

问题是所谓的 byte order mark。这就是我的变量上那些额外的三个字节 (\xef\xbb\xbf)。

来自 this post.


只需使用 "utf-8-sig" 编解码器:

fp = open("file.txt")
s = fp.read()
u = s.decode("utf-8-sig")

这为您提供了一个没有 BOM 的 unicode 字符串。然后你可以使用

s = u.encode("utf-8")

在 s [引用原始帖子的变量] 中返回一个普通的 UTF-8 编码字符串。