栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么sys.getdefaultencoding()与sys.stdout.encoding不同,这如何破坏Unicode字符串?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么sys.getdefaultencoding()与sys.stdout.encoding不同,这如何破坏Unicode字符串?

我的问题是为什么两个编码变量首先不同

它们有不同的用途。

sys.stdout.encoding
应该是终端用来解释文本的编码,否则您可能会在输出中得到mojibake。在一个环境中可能是utf-8,在另一个环境中可能是cp437,等等。

sys.getdefaultencoding()
在Python 2上用于隐式转换(未明确设置编码时),即Python
2可以将仅ascii的字节字符串和Unipre字符串混合在一起,例如,
xml.etree.ElementTree
将ascii范围内的文本存储为字节字符串,或者
json.dumps()
返回仅ascii的字节字符串而不是Unipre在Python
2中-可能是由于性能-
字节代表ASCII字符比Unipre便宜。Python 3禁止隐式转换。

sys.getdefaultencoding()
总是
'ascii'
在Python
2的所有系统上运行,除非您重写它,否则不要这样做,否则它可能会隐藏错误,并且由于隐式转换(使用可能错误的数据编码)而导致数据容易损坏。

顺便说一句,还有另一种

sys.getfilesystemencoding()
可能与两者不同的通用编码。
sys.getfilesystemencoding()
应该是用于编码OS数据(文件名,命令行参数,环境变量)的编码。

使用声明的源代码编码

# -*- coding: utf-8 -*-
可能与所有上述编码不同。

自然地,如果您从文件,网络中读取数据;它可能使用与上述字符不同的字符编码,例如,如果使用Windows
ANSI编码保存在记事本中创建的文件,例如

cp1252
在另一个系统上,则所有标准编码都可能与此不同。

重点是:出于与Python无关的原因,可能会有 多种
编码,为避免麻烦,请使用Unipre表示文本:在输入时尽快将编码后的文本转换为Unipre,然后将其编码为字节(可能使用其他编码)在输出时尽可能晚-
这就是所谓的Unipre三明治的概念。

如何在这段简单的代码中使用错误的编码?

  1. 您的第一个代码示例不正确。您在Python 2的字节字符串中使用了不应该使用的非ASCII文字字符。仅将字节字符串的文字用于二进制数据(或在必要时使用本机字符串)。

    I need 20 000Γé¼.
    如果您在任何不使用utf-8兼容编码的环境(例如Windows控制台)中使用Python 2运行该代码,则该代码可能会产生mojibake,例如(注意字符噪声)

  2. 假设第二个代码示例

    reload(sys)
    不包含在其中,则可以。如果您不想在所有字符串文字前添加
    u''
    ; 你可以用
    from __future__ import unipre_literals

您的实际问题是

UnipreEnpreError
错误,
reload(sys)
而不是正确的解决方案!
正确的解决方案是在POSIX()上
LANG``LC_CTYPE
正确配置语言环境,或者在输出重定向到管道/文件或安装以将Unipre打印到Windows控制台时设置
PYTHONIOENCODING
envvar
win-unipre-console



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414487.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号