为何Python中'\xfc\xa9\xf1\xd2Mb\x80?'与'眉漏帽脪Mb\x80?'相等为True?
为什么这两个视觉不同的Unicode字符串会判定相等?
哈哈,这个问题其实是终端编码不匹配造成的视觉错觉,本质上这两个字符串的Unicode码点完全一致!我来给你一步步拆解:
- 首先,你看到的“眉漏帽脪”并不是真正的中文Unicode字符,而是终端把那些转义对应的Unicode码点,用错误的编码(比如GBK)解码显示出来的结果。
- 你可以用下面的代码验证两个字符串的底层码点完全相同:
运行后你会发现,两个列表的输出都是s1 = '\xfc\xa9\xf1\xd2Mb\x80?' s2 = '眉漏帽脪Mb\x80?' print([ord(c) for c in s1]) print([ord(c) for c in s2])[252, 169, 241, 210, 77, 98, 128, 63]——这就实锤了它们是同一个Unicode序列。
出现这种视觉差异的核心原因:
- 你的终端默认用中文编码(比如GBK)来显示内容,但Python输出的是Unicode字符串的UTF-8字节,终端把这些字节当成GBK编码解码,就把原本的拉丁字符(比如ü、©、ñ、Ò)转换成了看起来像中文的汉字。
- 举个具体例子:U+00FC(ü)的UTF-8字节是
0xC3 0xBC,这个字节组合在GBK编码里正好对应“眉”的编码;同理,其他几个字符的UTF-8字节组合也被终端错误解码成了对应的中文汉字,才造成了“两个不同字符串”的假象。
内容的提问来源于stack exchange,提问作者Zheng
相关产品推荐
相关产品推荐

