汉字比较在应返回true时返回false

时间:2019-07-05 04:39:23

标签: python unicode cjk

我正在对两个汉字之间进行简单的字符串比较,这两个汉字都可以从UTF-8正确解码(我认为),但是结果仍然不相等,我还无法弄清楚为什么。正在从输入文件中读取一个字符,而从已解码的EPUB书中读取了另一个字符。

我尝试过的事情:

  • 我已经从UTF-8解码了文件,并且从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

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

  • 文件中子的值:b'\ xef \ xbb \ xbf \ xe5 \ xad \ x90'
  • 上面的代码片段中显示的单词作为子的值:b'\ xe5 \ xad \ x90'

1 个答案:

答案 0 :(得分:1)

问题是所谓的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编码字符串[引用原始帖子的变量]。