rebeccaMyKid
V2EX  ›  问与答

python2.7 print 隐式 decode 的问题

  •  
  •   rebeccaMyKid · Aug 15, 2017 · 1644 views
    This topic created in 3287 days ago, the information mentioned may be changed or developed.

    my_unicode = u"Hi \u2119\u01b4\u2602\u210c\xf8\u1f24"

    怎么我在 2.7 下直接 print 出来式可以的,而 ppt 里给的是错误?

    >>> print my_unicode
    Hi ℙƴ☂ℌøἤ
    

    文章链接

    5 replies    2017-08-15 10:40:07 +08:00
    glasslion
        1
    glasslion  
       Aug 15, 2017
    和你的命令行的 locale/language 设置有关,utf-8 就不会报错
    rebeccaMyKid
        2
    rebeccaMyKid  
    OP
       Aug 15, 2017
    @glasslion 能简单讲讲吗?
    这么理解对不对:
    print 需要的是 bytes,那如果我直接 print 会有一个隐式的 decode,而这个 decode 是根据终端的设置来的。
    但 `"Hello " + my_unicode` 这里的隐式 decode 就是跟 sys.getdefaulencoding()相关的。

    这么理解对吗?
    glasslion
        3
    glasslion  
       Aug 15, 2017   ❤️ 1
    @rebeccaMyKid

    1. ` locale.getpreferredencoding()` 是 Python 在 open 文件时默认使用的 encoding
    2. `sys.getdefaultencoding() ` 是 Python 进行 str/unicode(byte/str) 转换时默认使用的 encoding
    3. `sys.getfilesystemencoding()` 是用来 encoding 文件**名**的, 例如 open('ℙƴ☂ℌøἤ,txt')
    4. 标准输入输出(print)的 encoding:
    4.1 若设置了 `PYTHONIOENCODING` 环境变量, 则以次变量为准
    4.2 标准输入输出是打到终端的话, 看终端的 locale 配置,e.g. linux 的 LANG 环境变量, 在 windows cmd 的代码页
    4.3 标准输入输出被重定向到文件的话, 则参照 1, 用的是 ` locale.getpreferredencoding()`
    fxxkgw
        4
    fxxkgw  
       Aug 15, 2017   ❤️ 1
    @rebeccaMyKid 有个地方不对
    u ’中文’=‘中文’.decode(encode) 这个地方就是你说的隐式 decode
    此处 encode 值为 sys.stdin.encoding,而不是 sys.getdefaulencoding()
    sys.getdefaulencoding()是系统编码 sys.stdin.encoding sys.stdout.encoding 是终端 两者不一样 前者一般是 ASCII 后者一般是 utf-8
    rebeccaMyKid
        5
    rebeccaMyKid  
    OP
       Aug 15, 2017
    @fxxkgw 不对啊,print 是 sys.stdout.encoding,但 u'中文'.decode()这个用的是 sys.getdefaultencoding()
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   879 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:52 · PVG 05:52 · LAX 14:52 · JFK 17:52
    ♥ Do have faith in what you're doing.