python – sys.setdefaultencoding(‘utf-8’)的危险
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – sys.setdefaultencoding(‘utf-8’)的危险,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4050字,纯文字阅读大概需要6分钟。
内容图文
![python – sys.setdefaultencoding(‘utf-8’)的危险](/upload/InfoBanner/zyjiaocheng/715/75ec0239adaf43dba7b4880d16efb8c4.jpg)
在Python 2中有一种令人沮丧的设置sys.setdefaultencoding(‘utf-8’)的趋势.任何人都可以列出问题的真实例子吗?这样的论点是有害的,或者隐藏错误听起来不是很有说服力.
更新:请注意,这个问题只是关于utf-8,它不是关于改变默认编码“一般情况下”.
如果可以,请举一些代码示例.
解决方法:
原始海报要求提供代码,证明交换机是有害的 – 除了它“隐藏”与交换机无关的错误.
结论摘要
根据我收集的经验和证据,以下是我得出的结论.
>现在将defaultencoding设置为UTF-8是安全的,除了专门的应用程序,处理来自非unicode就绪系统的文件.
>对交换机的“官方”拒绝是基于与绝大多数最终用户(不是图书馆提供商)不再相关的原因,因此我们应该停止阻止用户进行设置.
>默认情况下,在正确处理Unicode的模型中工作比手动使用unicode API更适合于系统间通信的应用程序.
实际上,非常频繁地修改默认编码可以避免绝大多数用例中的数量为user headaches.是的,在某些情况下处理多种编码的程序会默默地行为不端,但由于这种切换可以零碎地启用,因此这不是最终用户代码中的问题.
更重要的是,启用此标志是一个真正的优势是用户的代码,既可以减少必须手动处理Unicode转换的开销,使代码混乱并使其可读性降低,又可以避免程序员无法执行此操作时的潜在错误在所有情况下都适当.
由于这些声明几乎完全与Python的官方通信线路相反,我认为对这些结论的解释是有道理的.
在野外成功使用修改后的defaultencoding的示例
> Fedora的Dave Malcom认为它是always right.他在调查风险之后提议改变所有Fedora用户的分发范围def.enc.= UTF-8.
尽管Python会破坏的原因只是散列行为I listed,但核心社区中的任何其他对手都没有将其作为担心甚至same person处理用户票据的理由.
Resume of Fedora:不可否认,变更本身被核心开发人员描述为“非常不受欢迎”,并被指责与先前版本不一致.
>有3000 projects alone at openhub这样做.他们有一个慢搜索前端,但扫描它,我估计98%使用UTF-8.没有发现令人讨厌的惊喜.
>有18000(!) github master branches改变了.
虽然核心社区的变化是“unpopular”,但它在用户群中非常受欢迎.虽然这可以被忽视,但由于已知用户使用hacky解决方案,我认为这不是一个相关的论点,因为我的下一个观点.
>由于这个原因,GitHub上只有150 bugreports个.以实际100%的速度,变化似乎是积极的,而不是消极的.
为了总结人们遇到的现有问题,我已经浏览了所有上述票据.
> Chaging def.enc. UTF-8通常是在问题结束过程中引入但未删除的,通常作为解决方案.考虑到它的“坏消息”,一些较大的人在temporary fix被删除,但更多的错误记者是justglad约the fix.
>一些(1-5?)项目修改了他们的代码手动进行类型转换,因此他们不再需要更改默认值.
>在两个例子中,我看到有人声称使用def.enc.设置为UTF-8导致完全缺乏of output entirely,没有解释测试设置.我无法验证声明,我测试了一个并发现相反的情况属实.
>一个claims他的“系统”可能取决于不改变它,但我们不知道为什么.
>一个(也是唯一一个)有一个真正的理由要避免它:ipython要么使用第三方模块,要么测试运行者以不受控制的方式修改他们的过程(它的支持者提倡def.enc.变更从不存在争议仅在翻译设置时,即“拥有”过程时).
>我发现零指示“é”和“u’é”的不同哈希值会导致现实世界代码出现问题.
> Python没有“破解”
将设置更改为UTF-8后,单元测试所涵盖的Python功能与??没有交换机的情况完全不同.但是,开关本身根本没有经过测试.
>在bugs.python.org上建议沮丧的用户
第一个演示了交换机在亚洲的建立程度(与github参数相比).
> Ian Bicking published他支持始终启用此行为.
I can make my systems and communications consistently UTF-8, things will just get better. I really don’t see a downside. But why does Python make it SO DAMN HARD […] I feel like someone decided they were smarter than me, but I’m not sure I believe them.
> Martijn Fassen,虽然反驳Ian,admitted,但ASCII首先可能是错误的.
I believe if, say, Python 2.5, shipped with a default encoding of UTF-8, it wouldn’t actually break anything. But if I did it for my Python, I’d have problems soon as I gave my code to someone else.
>在Python3中,他们不“实践他们所宣扬的”
反对任何def.enc.由于依赖于环境的代码或隐含性而变得如此严厉,讨论here围绕‘unicode sandwich’的范例以及相应的必要隐含假设进行了讨论.
此外,他们创建了编写有效Python3代码的可能性,如:
>>> from 褐褑褒褓褔褕褖褗褘 import *
>>> def 空手(合氣道): あいき(ど(合氣道))
>>> 空手(う??('
标签:python,encoding,python-2-x,utf-8
来源: https://codeday.me/bug/20190915/1806178.html