仅包含 ASCII 字符的 UNICODE 字符串是不是总是等于 ASCII 字符串?

Posted

技术标签:

【中文标题】仅包含 ASCII 字符的 UNICODE 字符串是不是总是等于 ASCII 字符串?【英文标题】:Will a UNICODE string just containing ASCII characters always be equal to the ASCII string?仅包含 ASCII 字符的 UNICODE 字符串是否总是等于 ASCII 字符串? 【发布时间】:2015-04-22 00:59:32 【问题描述】:

我注意到以下内容:

>>> u'abc' == 'abc'
True
>>> 'abc' == u'abc'
True

这是否总是正确的,还是可能取决于系统区域设置? (似乎字符串在 python 3 中是 unicode:例如this question,但在 2.x 中是字节)

【问题讨论】:

ASCII 集中的字符与代码页无关。只有扩展字符(0x80 到 0xff)在语言环境之间会有所不同。 @Phylogenesis:有很多编码使用 ASCII 作为基础。 【参考方案1】:

在比较两种类型时,Python 2 使用 ASCII 编解码器在 unicodestr 之间进行强制转换。所以是的,这总是是真的。

也就是说,除非您弄乱了 Python 安装并使用 sys.setdefaultencoding() 更改该默认值。你不能正常这样做,因为 sys.setdefaultencoding() 函数在启动时从模块中删除,但是有一个 Cargo Cult 正在流行,人们使用 reload(sys) 来恢复该函数并更改将默认编码转换为其他内容以尝试修复隐式编码和解码问题。正是出于这个原因,这是一件愚蠢的事情。

【讨论】:

sys.setdefaultencoding() 到底有什么问题? @techtonik:更改系统默认值可能会破坏依赖默认为 ASCII 的软件包,并且仅更改它掩盖您的代码依赖于隐式编码和解码。如果您将其设置为 Latin-1,则所有字节 unicode 解码都可以神奇地工作,但实际上没有意义,如果您将其设置为 UTF-8,所有 unicode 字节编码都可以工作,但可能没有意义,等等。你是有效地预先打断你的腿以防它摔断,而不是一开始就避免摔断你的腿。 对我来说似乎是workflow 问题。有更真实/明确的例子吗? @techtonik:我看不出这是一些用户想要维护的晦涩的副作用。坦率地说,这是对问题的可笑过度简化。具体示例见Dangers of sys.setdefaultencoding('utf-8')。 @techtonik 我不明白为什么你认为这是一个工作流程问题,因为包依赖于无法以非黑客方式更改的正常默认值。如果有的话,你试图绕过它只是为了改变它以获得“固定行为”(针对你的特定问题或工作流程)是真正的工作流程问题。

以上是关于仅包含 ASCII 字符的 UNICODE 字符串是不是总是等于 ASCII 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Unicode 字符输出为一对 ASCII 字符?

如何检查字符串是不是仅包含 ASCII?

如何使精确的 unicode 字符优先于 ASCII 版本?

如何验证字符串是不是仅包含字母、数字、下划线和破折号?

彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, Utf-8

ASCII,Unicode,GBK和UTF-8字符编码的区别和联系