Sylv
2015-05-27 18:59:06 +08:00
话说我怎么都没法从你发的 "gn· ¿EA{3©äIÇ " 得到你说的两个 md5 结果,我得到的是 7f5b83f8d5a7a809928bffa0197381f8。
我猜可能是 Unicode 的等价性问题导致的。
例如下面虽然字符 ä 的样子都一样,但 Unicode 码点是不同的,所以编码成 utf-8 的 bytes 序列也会是不同的:
>>> u"ä"
u'\xe4'
>>> u"ä".encode('utf-8')
'\xc3\xa4'
>>> u"ä"
u'a\u0308'
>>> u"ä".encode('utf-8')
'a\xcc\x88'
而 u'a\u0308' 可以被 normalize 为 u'\xe4':
>>> import unicodedata
>>> unicodedata.normalize('NFC', u'a\u0308')
u'\xe4'
所以可能是在输入到 Python 或 JavaScript 过程中字符串中的 Unicode 字符被 normalize 过了,导致字符串不等价了,以致于 md5 不等。