为什么Python3区分ascii和utf-8

为什么Python3区分ascii和utf-8,python,string,encoding,utf-8,language-lawyer,Python,String,Encoding,Utf 8,Language Lawyer,所有ascii字符都可以用utf-8表示,即前七位的空格。只使用utf-8可以大大简化字符串处理。虽然utf-8不是固定长度的格式,因此在ascii方面会有一定的性能损失,但我感觉python在性能提升之前通常会使用pythonic 我的问题:为什么python3以这种方式实现字符串,而不是以utf-8的方式实现字符串?因此,不将其表示为具有不同表示的比特流,而是始终使用utf-8编码 我不是在寻找SO用户的个人意见,而是寻找政治公众人物或独裁者对这一点的发言记录。来自: 根本原因 关于目前的实

所有ascii字符都可以用utf-8表示,即前七位的空格。只使用utf-8可以大大简化字符串处理。虽然utf-8不是固定长度的格式,因此在ascii方面会有一定的性能损失,但我感觉python在性能提升之前通常会使用pythonic

我的问题:为什么python3以这种方式实现字符串,而不是以utf-8的方式实现字符串?因此,不将其表示为具有不同表示的比特流,而是始终使用utf-8编码

我不是在寻找SO用户的个人意见,而是寻找政治公众人物或独裁者对这一点的发言记录。

来自:

根本原因 关于目前的实施,有两类投诉 unicode类型:在仅支持UTF-16的系统上,用户抱怨 未正确支持非BMP字符。关于系统使用 UCS-4在内部,有时在使用UCS-2的系统上,存在 Unicode字符串占用太多内存的抱怨-尤其是 与Python2.x相比,在Python2.x中,相同的代码通常使用ASCII 字符串,即ASCII编码的字节字符串。根据提议的方法, 仅ASCII的Unicode字符串将再次使用每个字符仅一个字节; 同时仍然允许对包含非BMP的字符串进行有效的索引 作为包含这些字符的字符串,每个字符将使用4个字节 性格

这种方法的一个问题是对现有应用程序的支持 e、 g.扩展模块。为了兼容性,需要使用冗余表示 可以计算。鼓励申请者逐步取消对技术的依赖 如有可能,请提供具体的内部表示。作为与 其他库通常需要某种类型的内部 在表示中,规范选择UTF-8作为推荐方式 向C代码公开字符串的方法

对于许多字符串,例如ASCII,实际上可能会有多种表示形式 共享内存,例如,最短的表单可以与UTF-8表单共享 如果所有字符都是ASCII。有了这样的共享,系统的开销 兼容性表示减少。如果陈述确实共享 数据时,也可以省略结构字段,从而减少基数 字符串对象的大小

如果上面的文字不清楚:

我们希望大多数字符串表示都能节省空间 只要有可能,我们就需要高效的索引 我们希望与所有系统兼容,并在所有系统上提供所有Unicode
结果是,使用单个内部表示至少会使一个约束失效。

Python3默认情况下使用utf-8编码,所以我不知道您的问题到底在问什么…@wim我试图把它说得更清楚。虽然它使用utf-8作为默认值,但仍然存在二进制字符串,例如,在尝试进行字符串比较时,可能会导致严重的错误。我的问题是:为什么语言版本的设计不允许一种类型的表示,它是这样设计的,一种类型的表示就是str表示。“utf-8”和“ascii”都是编码。没有utf-8 str对象。@wim,你的权利,我指的是编码。然而,我仍然有一种感觉,那就是增加的价值比麻烦少。所以我还在想原因。你仍然没有一个连贯的问题。如果您问python为什么不只使用utf-8编码,那是因为我们需要能够与使用其他编码的文件或服务进行通信的软件。感谢您的挖掘。我可以理解他们的推理,尽管我不确定最终会得出相同的结论。因为所有的内存管理都可以通过C代码中的标志在后台完成。但我想这是基于观点的。@magu_u我不明白你在C代码中所说的标志是什么意思。如果只有一个utf-8表示形式,那么每当使用超过一个字节的字符时,就会失去有效的索引。在当前的实现中,当您使用宽字符时,内存效率会降低,尽管这取决于具体情况,但索引效率会更好。仍然存在无法实现O1索引的情况,但这比仅使用utf-8要难得多,因为在utf-8中,大多数非英语测试都会遇到性能不佳的问题。我的推理是,python内部可以根据字符串中任何字符的值大于或小于127在内部进行分支。因此,可以保留ascii的快速索引和utf-8的慢速索引。由于字符串在python中是不可变的,因此此信息任何大于127的字符都可以在对象创建时保存为标志。@magu_uuu是的,但问题是这种情况太常见了。基本上,任何非英语测试都需要索引。然而,事实证明,相当多的语言可以使用2字节表示而不是utf -8这意味着这些语言可以在O1时间内编制索引,而代价是为ASCII字符浪费一些空间。顺便说一下:当前的实现已经可以像您所说的那样用于ASCII文本。区别在于非ASCII文本的情况。他们决定支付更多的空间来为更多的文本建立O1索引。