Python每日一练0015

问题

如何比较两个字面一样,但字节不一样的字符串

例如:

>>> 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 == b
False

解决方案

使用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上很热的一个问题,原问题见:https://stackoverflow.com/questions/49662585/how-do-i-compare-a-unicode-string-that-has-different-bytes-but-the-same-value

关于Unicode对这个问题的介绍可以见:http://www.unicode.org/faq/normalization.html

来源

Stack Overflow

关注

欢迎关注我的微信公众号:python每日一练

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值