
http://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes
我看了下现在(包括 V2EX 上)还在使用 sys.setdefaultencoding('utf-8') 来解决中文编码问题的有很多,而且很多人在使用的时候压根没有意识到带来的 bug。特写此文与大家讨论。
1 florije 2016-02-01 12:03:39 +08:00 一点都没说到点上,建议搜下 v2 历史,有个帖子说到了,建议好好看看再 append 。 |
2 zjq426 2016-02-01 12:04:08 +08:00 1. 这么用确实方便 2. 这么用确实用 dict 的时候遇到过问题 3. 这么用确实有诡异的疑似 bug 出现,或者说,出现了一些和 naive 理解上偏差 好吧我以后不这么用了,我错了。 所有 text string 都应该是 unicode 类型,而不是 str |
3 nyanyh 2016-02-01 12:07:04 +08:00 所以 Python 3 是没问题咯 |
4 zjq426 2016-02-01 12:09:30 +08:00 然而你就不能利用 python2 提供的 unicode=>ascii 转换的便利了 |
5 wgwang 2016-02-01 12:10:05 +08:00 python3, python3, python3 重要的事说 3 遍 |
6 aivier 2016-02-01 12:26:12 +08:00 隔壁 NodeJS 路过看看→_→...GBK 也是比较麻烦的事,要用 iconv |
7 nooper 2016-02-01 12:45:21 +08:00 via iPad 80 %以上的代码是不良习惯, 10 是 hacking code 。 10 编的是实质性的代码。奇怪的 hacking code 为什么要写大家一向是 badu 出来的 |
8 pynix 2016-02-01 12:49:46 +08:00 python3 才是正确的选择。。。 |
11 ernest OP @florije 能告知那篇帖子的地址或者关键词吗,我来找来读下。谢谢! 关键点并不在 print 上吧?任何涉及到 encode/decode 的操作都会出问题。 |
12 FrankFang128 2016-02-01 14:40:34 +08:00 via Android Python 永远的痛 |
13 ernest OP @FrankFang128 也还好,能按照最佳实践来不会出问题。只能说 Python 给的糖太多了。 |
14 tt0411 2016-02-01 14:44:02 +08:00 python2 脚本开头习惯性添加: from __future__ import unicode_literals |
15 loading 2016-02-01 14:44:17 +08:00 via Android python 最不爽就是这里! |
17 ernest OP |
19 florije 2016-02-01 15:53:52 +08:00 @ernest 首先三个概念: 1. str is for bytes, NOT strings 2. unicode is for strings 3. UTF-8, UTF-16, and UTF-32 are serialization formats NOT Unicode 然后尽量别用 print 打印比较。 然后再看看上面的兼容性问题~以及博客里面说的内容~ |
20 florije 2016-02-01 16:00:03 +08:00 @ernest 然后你再看看你所说的 encode , decode 是什么情况? encode(): Gets you from Unicode -> bytes decode(): Gets you from bytes -> Unicode so ,这么来看问题都一点点解决了吧? |
21 Tink PRO 上 python3 |
22 ernest OP @florije 你所说的这些我在 “问题的根源: Python2 中的 String ”一段里已经都涵盖了。 |
24 TankyWoo 2016-02-01 17:23:11 +08:00 @tt0411 pocoo 的实践是不建议用 unicode_literals ,虽然我倾向于用... http://click.pocoo.org/5/python3/ https://github.com/PythonCharmers/python-future/issues/22 |
25 ming2281 2016-02-01 20:09:03 +08:00 via Android py2 中有别的语言没有的编码问题, 属于基本功了, 不至于动用 sys |
26 fy 2016-02-01 20:51:37 +08:00 危言耸听! 另外讲道理还是赶紧迁移到 Python3 |
27 latyas 2016-02-02 11:38:33 +08:00 defaultencoding = ascii 难道就没问题了? = utf-8 才是本该正确的。 |