【问题标题】: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 作为基础。

标签: python python-2.7 unicode character-encoding python-unicode


【解决方案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 我不明白为什么你认为这是一个工作流程问题,因为包依赖于无法以非黑客方式更改的正常默认值。如果有的话,你试图绕过它只是为了改变它以获得“固定行为”(针对你的特定问题或工作流程)是真正的工作流程问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2018-11-27
  • 2011-01-27
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多