关于康熙部首导致的字典查询异常

这篇文章的起因是一个报错,我们来看看:

a = {"⽐赛阶段": "16强"}
print(a["比赛阶段"])

运行结果:
在这里插入图片描述
为什么查询不出来呢?难道两个比赛阶段不一样?我们进一步测试一下:

print("⽐赛阶段" == "比赛阶段")

运行结果是:False
在这里插入图片描述
难道说是其中一个包含了不可见的零宽字符?我们来看看两个字符串的长度:

print(len("⽐赛阶段") == len("比赛阶段"))

运行答案是 True
在这里插入图片描述
可以看到,这两个字符串都是4个汉字,说明没有零宽字符。那么为什么他们不一样呢?那我们看一下每个文字的 Unicode 码:

import json

print(json.dumps("⽐赛阶段"))
print(json.dumps("比赛阶段"))

运行:
在这里插入图片描述
后面的三个字赛阶段是一样的,但是两个比的 Unicode 码竟然不一样?

我们分别把\u2f50和\u6bd4重新转成汉字看看:

print(chr(int("2f50", 16)))
print(chr(int("6bd4", 16)))

在这里插入图片描述
原来电脑里面真的有两个比?这两个比有什么区别呢?我们到https://unicodemap.org/ 上面查询看看:
https://unicodemap.org/details/0x6bd4/index.html
https://unicodemap.org/details/0x2f50/index.html

在这里插入图片描述

在这里插入图片描述

2f50对应的⽐实际上是康熙部首[1]。真正比较的比对应的 Unicode 码为6bd4。

查询可得:

基本汉字,unicode编码范围:4E00-9FA5
康熙部首,unicode编码范围:2F00-2FD5
扩展部首,unicode编码范围:2E80-2EF3

unicode中文字符集中存在两个极为相似的汉字但编码不同的情况,主要是因为康熙部首和扩展部首中存在和基本汉字相似的汉字,如 :

“⼀” 和 “一”,
“⼄” 和 “乙”,
“⼆” 和 “二”,

常见的康熙字典对照:
https://github.com/furuiyang0715/spider_notes/blob/master/codes/kangxi.json

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值