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 2
一点都没说到点上,建议搜下 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 1
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 2016-02-01 16:03:42 +08:00
上 python3
|
22
ernest OP @florije 你所说的这些我在 “问题的根源: Python2 中的 String ”一段里已经都涵盖了。
|
24
TankyWoo 2016-02-01 17:23:11 +08:00 1
@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 才是本该正确的。 |