python2.7 print 隐式 decode 的问题

2017-08-15 09:38:56 +08:00
 rebeccaMyKid

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

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

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

文章链接

1224 次点击
所在节点    问与答
5 条回复
glasslion
2017-08-15 09:56:07 +08:00
和你的命令行的 locale/language 设置有关,utf-8 就不会报错
rebeccaMyKid
2017-08-15 10:14:02 +08:00
@glasslion 能简单讲讲吗?
这么理解对不对:
print 需要的是 bytes,那如果我直接 print 会有一个隐式的 decode,而这个 decode 是根据终端的设置来的。
但 `"Hello " + my_unicode` 这里的隐式 decode 就是跟 sys.getdefaulencoding()相关的。

这么理解对吗?
glasslion
2017-08-15 10:21:52 +08:00
@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
2017-08-15 10:23:25 +08:00
@rebeccaMyKid 有个地方不对
u ’中文’=‘中文’.decode(encode) 这个地方就是你说的隐式 decode
此处 encode 值为 sys.stdin.encoding,而不是 sys.getdefaulencoding()
sys.getdefaulencoding()是系统编码 sys.stdin.encoding sys.stdout.encoding 是终端 两者不一样 前者一般是 ASCII 后者一般是 utf-8
rebeccaMyKid
2017-08-15 10:40:07 +08:00
@fxxkgw 不对啊,print 是 sys.stdout.encoding,但 u'中文'.decode()这个用的是 sys.getdefaultencoding()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX