汉字比较 returning false 应该 return true
Chinese character comparison returning false when it should return true
我正在对两个从 UTF-8 正确解码(我认为)的汉字进行简单的字符串比较,但是,结果仍然不相等,我一直无法弄清楚原因。一个字符是从输入文件中读取的,另一个是从解码的 EPUB 书中读取的。
我试过的:
- 我已经从 UTF-8 解码了文件,EPUB 图书的内容也是从 UTF-8 解码的。
- 阅读了很多关于类似问题的帖子,但我能找到的所有内容都归结为不知道如何正确解码字符串的人。
代码
读取我获取要比较的字符的文件:
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 并适当地找到字符。如果我检查从文件中读取的字符的二进制值和上面显示的覆盖字:
- 我文件中子的值:b'\xef\xbb\xbf\xe5\xad\x90'
- 子的值如上面代码片段所示:b'\xe5\xad\x90'
问题是所谓的 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 编码字符串。
我正在对两个从 UTF-8 正确解码(我认为)的汉字进行简单的字符串比较,但是,结果仍然不相等,我一直无法弄清楚原因。一个字符是从输入文件中读取的,另一个是从解码的 EPUB 书中读取的。
我试过的:
- 我已经从 UTF-8 解码了文件,EPUB 图书的内容也是从 UTF-8 解码的。
- 阅读了很多关于类似问题的帖子,但我能找到的所有内容都归结为不知道如何正确解码字符串的人。
代码
读取我获取要比较的字符的文件:
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 并适当地找到字符。如果我检查从文件中读取的字符的二进制值和上面显示的覆盖字:
- 我文件中子的值:b'\xef\xbb\xbf\xe5\xad\x90'
- 子的值如上面代码片段所示:b'\xe5\xad\x90'
问题是所谓的 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 编码字符串。