问题
如何比较两个字面一样,但字节不一样的字符串
例如:
>>> a = u'\u4eba\u53e3\u3058\u3093\u3053\u3046\u306b\u81be\u7099\u304b\u3044\u3057\u3083\u3059\u308b'>>> b = u'\u4eba\u53e3\u3058\u3093\u3053\u3046\u306b\u81be\uf9fb\u304b\u3044\u3057\u3083\u3059\u308b'>>> print(a, b, sep='\n')人口じんこうに膾炙かいしゃする人口じんこうに膾炙かいしゃする
这里的a和b字符串是一样的,但仔细观察可以发现,其中a字符串是\u7099
,b字符串对应的是\uf9fb
所以虽然a和b是字面上一模一样的字符串,但a实际上和b是不等的
>>> a == bFalse
解决方案
使用unicodedata
库的normalize
将两个字符串标准化后,再进行比较就可以了
>>> import unicodedata>>> normalize_a = unicodedata.normalize('NFC', a)>>> normalize_b = unicodedata.normalize('NFC', b)>>> print(normalize_a)人口じんこうに膾炙かいしゃする>>> print(normalize_b)人口じんこうに膾炙かいしゃする>>> print(normalize_a == normalize_b)True
讨论
这个问题是最近在Stack Overflow上很热的一个问题,原问题见:
关于Unicode对这个问题的介绍可以见:
来源
Stack Overflow
关注
欢迎关注我的微信公众号:python每日一练