我正在对两个汉字之间进行简单的字符串比较,这两个汉字都可以从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
它将打印匹配查找并适当地找到字符。如果我检查从文件读取的字符和上面显示的覆盖单词的二进制值:
答案 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编码字符串[引用原始帖子的变量]。