还挺神奇的,U+2EDD (⻝)和 U+2F29 (⼩)都是康熙部首字符:
2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;;
2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;;
UnicodeData.txt 里面也都相应标出了 <compat> 的分解形式:一个是 U+5C0F (汉字的“小”),一个是 U+98DF (汉字的“食”),但是它们 NFKC normalize 的结果却不同:
>>> f'U+{ord(unicodedata.normalize('NFKC', chr(0x2F29))):04X}'
'U+5C0F' (中文“小”)
>>> f'U+{ord(unicodedata.normalize('NFKC', chr(0x2FB7))):04X}'
'U+2FB7' (仍然是康熙部首“⻝”)
感觉会不会是 Unicode 的问题……但无论如何,要想手动 normalize 的话应该把 UnicodeData.txt 里面的第六列提出来也可以。但例如 Firefox 用的似乎是 confusables.txt [1],比 UnicodeData 来说提供了更多基于字形的 normalization ,也可以考虑一下。
[1]
https://github.com/unicode-org/icu/blob/main/icu4c/source/data/unidata/confusables.txt