小弟用的是 python3.5 ,听说 python3 解决了编码问题
然而
import urllib.request
html = urllib.request.urlopen('http://www.baidu.com').read().decode('utf-8')
print(html)
结果:
Traceback (most recent call last):
File ".\Desktop\work\wearther.py", line 3, in <module>
print(html)
UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 25395: illegal multibyte sequence
这样也不行.decode('utf-8').encode('utf-8')
所以新手求助啊
|      1276562578      2016-06-04 11:19:46 +08:00 先看看是什么格式的编码,用 chardet 库,然后再 de 和 en | 
|  |      2GPU      2016-06-04 11:24:33 +08:00 不是应该用 requests 吗?  腰不酸腿不疼 | 
|      3SuperMild      2016-06-04 11:24:34 +08:00 可能是 Windows 的坑 | 
|  |      4janxin      2016-06-04 11:28:59 +08:00 试了一下没有问题啊,你这是 Windows 的坑吧 | 
|      5a412739861      2016-06-04 11:29:56 +08:00 我用 requests 似乎需要设置这个的,直接能够打开 gbk 的。 只是在 post 数据的时候,要 encode 成对应的编码,这个地方要自己写。 | 
|  |      6lovebeyondalways OP @janxin 我靠 windows 这坑怎么跳过 | 
|  |      7Sylv      2016-06-04 11:29:59 +08:00 via iPhone  1 Python 3 的字符串已经是 unicode 了,你为什么还要 decode ? 基础知识: unicode.encode(encoding) -> bytes bytes.decode(encoding) -> unicode unicode.decode(encoding) -> unicode.encode(defaultencoding).decode(encoding) -> unicode Python 3 是解决了部分 Python 2 的编码坑,但并不代表不再需要掌握基础的编码知识了。 | 
|  |      8uniquecolesmith      2016-06-04 11:42:19 +08:00  3 你对编码的理解反了, unicode 是字符集,是规范,而 utf-8 是 unicode 的一种实现。或者你可以理解为 unicode 是非可视编码,而 utf-8 是可视编码,所以应该是个 encode('utf-8')才可行 | 
|      9annielong      2016-06-04 11:43:00 +08:00 大坑, windows+中文,回回都要被编码坑一下, | 
|  |      10uniquecolesmith      2016-06-04 11:47:42 +08:00  1 补充 没记错的话, windows 下应该 urllib.request.urlopen('http://www.baidu.com').read().encode('cp936')或者其他 | 
|  |      11xiandao7997      2016-06-04 11:51:04 +08:00 @lovebeyondalways 在 iV2 结果基本上就是劝你换 mac :) 以前也遇到这个坑,跟别人回复的一样,数据获取到了用 chardet 先检测一下编码,然后再 decode/encode, win 命令行里输出的话 utf8 貌似是不行的,只可以用 unicode/gb2312/gbk/cp936 ,记不清了,你可以再试试~ | 
|  |      12congeec      2016-06-04 12:02:28 +08:00 不是 Python 坑你,是 Terminal 坑你。你的代码我在 OS X 下执行就没问题。 Windows ,如果我没记错的话,用 UCS-2/GBK 处理中文。你的 Terminal (应该是 cmd.exe 吧)有没有用 UTF-8 ? | 
|  |      13Delbert      2016-06-04 12:09:35 +08:00 via Android win 的 cmd 是 cp936 , unicode 是 65001(印象中是这个) | 
|      14YuJianrong      2016-06-04 12:10:42 +08:00 via iPad  3 这个原因很容易理解吧?主要有两点 1. GBK 没有完全覆盖 unicode ,有些 unicode 字符无法编码成 GBK 2. windows 版本的 print 在中文 windows 环境下输出需要编译成环境编码也就是 cp936 , python 视 cp936 等同 GBK (这也没错) 所以其实是 print 的锅,你不如把字符串编码成 utf8 存文件来看好了,不要 print 。 | 
|  |      1521grams      2016-06-04 12:15:05 +08:00 我用的还是 2.7 , 更痛苦,尤其在 windows 下,简直噩梦。 | 
|  |      16cosven      2016-06-04 12:44:03 +08:00  1 @YuJianrong  正解 看它报错的位置嘛,说的是第三行,而不是第二行的 decode 有错,而楼上许多人都在分析 decode('utf-8') 这句有错。显然没有抓住问题关键。 windows cmd 下 print 会把字符串转换成 gbk 编码来输出,所以才会有 LZ 现在遇到的问题。 >>> html.encode('gbk') # 说明 html 这个字符串中有些字符不能编码成 gbk UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 25395: illegal multibyte sequence *****所以, LZ 的问题,并不是单纯的不能输出中文的问题***** 解决办法 1. 如 YuJianrong 所说:把它输出到文件是一种办法 2. 参考这篇博客,貌似可以输出到 cmd: http://blog.csdn.net/jim7424994/article/details/22675759 ---------题外话(关于 cmd python3 输出中文)------------------- 参考 http://www.crifan.com/python_3_x_auto_handle_string_encode_and_decode_to_and_from_unicode_then_output_to_cmd/ 这篇博客,对 windows 下 python3 输出中文的一些情况作了测试。 ---------------------------------------------------------------------------- @Sylv urlopen('http://www.baidu.com').read() 之后的对象是 bytes ,不是字符串 @uniquecolesmith bytes 对象应该 decode 成 utf-8 ,而不是 encode | 
|      17walleL      2016-06-04 13:25:02 +08:00 做了一些测试,我来整理一下吧(我用的 python2.7) 1. content = urllib.request.urlopen('http://www.baidu.com').read() # 得到 bytes 2. text = content.decode('utf8') # 得到 unicode(这里已确定 content 为 utf8 编码) 3. print(text) # print 时 python 会根据当前 sys.stdout 的编码对 text 进行 encode, win 下 stdout 的编码是 gbk ,而有些 unicode 无法编码为 gbk ,所以报错 解决方案: 1. @cosven 的回复中提到的博客里的方法:改 sys.stdout 的编码 2. 先 encode 为 gbk ,并指定 errors='replace' (当遇到不可编码字符时使用 ? 替换), 然后 print: print(text.encode('gbk', errors='replace')) #不推荐,无法解码的字符可能就成 ? 了 3. 结合 1,2: print(text.encode('gp18030')) | 
|  |      18lovebeyondalways OP | 
|  |      19cosven      2016-06-04 13:27:21 +08:00 事后又仔细阅读了 http://blog.csdn.net/jim7424994/article/details/22675759  这篇博文,它使用 GB18030 编码可以成功输出。 所以我猜(手上并没有 windows ): print(html.encode('gb18030')) 应该是可以正常输出的 参考: gbk 编码都多种: GB2312, GB18030, GBK https://www.zhihu.com/question/19677619 | 
|  |      20daimoon      2016-06-04 14:11:28 +08:00 简单的办法,把 python 安装目录中的 site.py 里面的 del sys.setdefaultencoding ,替换为 sys.setdefaultencoding("utf-8"). 以后就没问题了。 | 
|      21hard2reg      2016-06-04 14:34:13 +08:00 请用 requests | 
|      22hard2reg      2016-06-04 14:37:43 +08:00 你抓 QQ 空间更恶心,有些 emoji 表情也会导致错误。。。 | 
|      23ayaseangle      2016-06-04 14:40:04 +08:00 这是 cmd 的坑。。。 | 
|  |      24dofine      2016-06-04 15:09:12 +08:00 print 和 cmd 都很坑~~ | 
|  |      25vinceguo      2016-06-04 15:33:47 +08:00 via Android 别改 defaultencoding 。 here you go: bit.ly/unipain | 
|  |      26YUX PRO import sys import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') 在 python3 前面加上这三行就没有编码问题了 | 
|  |      27ioven      2016-06-04 18:13:46 +08:00 win 的坑,而非 py 坑 个人解决方法,使用 conemu[https://conemu.github.io],开启 unicode 支持,运行 lz 代码无压力 | 
|  |      28singer      2016-06-04 20:28:48 +08:00 | 
|  |      29weizhixiang      2016-06-04 21:25:31 +08:00 via Android win 的坑,首行加入#ciding=utf-8 | 
|  |      30weizhixiang      2016-06-04 21:26:06 +08:00 via Android @weizhixiang coding | 
|  |      31noe132      2016-06-05 00:39:33 +08:00 最新版本 Sublime 的 built in 的 python 的 build system 是这样写的 { "shell_cmd": "python -u \"$file\"", "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "env": {"PYTHONIOENCODING": "utf-8"}, "variants": [ { "name": "Syntax Check", "shell_cmd": "python -m py_compile \"${file}\"", } ] } 其中有个 "env": {"PYTHONIOENCODING": "utf-8"}, 添加一个这个环境变量 好像这样就不会出现 unicode 错误了 | 
|  |      32youtoshell      2016-06-05 01:24:12 +08:00 via Android  1 reload(sys) sys.setdefaultencoding('utf-8') | 
|      33Ciruelas      2016-06-05 05:03:07 +08:00 via iPhone 不知道你解决这个问题了没有,我前两天刚好碰到类似的问题。报这个错是因为控制台使用的是 gbk 编码,要么把控制台改成 utf8 编码,要么把输出内容 decode 以后再 encode 成 gbk | 
|  |      34binux      2016-06-05 05:18:49 +08:00  2 python 编码其实并不是坑, python2 也不是,只是觉得坑的人不理解编码是什么东西。 encode , decode 乱用,没有依据地胡乱指定编码。 | 
|  |      359hills      2016-06-05 08:35:35 +08:00 同意 ls ,反对 reload(sys) Python 的编码并不难理解,你只要理解 Unicode , GBK , UTF-8 , encode , decode 的含义即可。如果你使用 Windows ,需要知道 windows 的代码页是什么, CP936 是啥 | 
|  |      36lovebeyondalways OP @9hills 我靠…一大早又有那么多 v 友帮忙,非常感谢,我把 cmd 改成 utf-8 可以运行,现在在补充 Unicode 知识 | 
|      37kysida      2016-06-05 10:29:23 +08:00 一般这种问题是编码问题,这类问题可以直接尝试着使用 utf-8 , unicode 确实很重要 | 
|  |      38imn1      2016-06-05 10:33:27 +08:00 看上去像是 win win 首先要明白一个问题: cmd 默认编码不是 utf-8 ,无论怎么改只要 py 和 cmd 编码不同,输出就一定会出错 | 
|  |      39wwqgtxx      2016-06-05 10:58:33 +08:00 win 下这样输出也能搞定所有问题 print (((str(input))).encode('gbk', 'ignore').decode('gbk') ) | 
|  |      41est      2016-06-05 15:02:29 +08:00  1 py 没有编码问题。是各种环境自己把编码问题搞乱了。 | 
|      42Arnie97      2016-06-06 10:00:07 +08:00 via Android @weizhixiang 根本不对,这句话是指定 py2 源码文件的编码,对于 py3 是废话,因为 py3 要求源码必须是 utf8 。 | 
|      43dreamtrail      2016-06-06 10:19:45 +08:00 python 的编码很简单了,你要碰到 perl 的,那是真的会疯 | 
|  |      44brucedone      2016-06-06 12:41:48 +08:00 很多人刚开始学 py2 的时候,一定会被编码搞的很疯,但凡肯花点时间了解编码和解码原理的话,都可以很轻松走进 python 的大门 | 
|      45kaneg      2016-06-07 11:36:45 +08:00 编码问题不是单靠语言就能解决的, Java 设计之初就支持 unicode , 但是在 Java 中处理中文的坑,相信很多人肯定都踩过。 |