关闭

python编码问题之——Decode error - output not utf-8

标签: python编码utf-8unicodeascii
6435人阅读 评论(0) 收藏 举报
分类:

Decode error - output not utf-8这个问题,如果用sublime text2下运行python2。就知道这个坑有多大。python3的默认是Unicode,python2的是ascii。所以搜了好多资料,总结一下。


分析各个配置的作用。

1、# -*- coding: utf-8 -*-
用于说明源文件使用的编码,如果没有这个说明,源文件中有中文字符的时候会报SyntaxError: Non-ASCII character这样的错误。


2、sys.setdefaultencoding('utf-8')
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
这样是用于设置默认的编码格式——utf-8,由于模块加载的过程中setdefaultencoding会被删除,所以重新加载sys
后重新设置


3、"default_encoding": "UTF-8",
在sublime的preferences的Setting-Default中,"default_encoding": "UTF-8"是配置sublime环境下的编码


4、Python.sublime-build中的设置
{
"cmd": ["python", "-u", "$file"],
"path":"C:/Python27",
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"shell":"true",
"encoding": "utf-8"
}
这个设置跟sublime下运行python的编码有关,反正"encoding": "utf-8"保证整套编码都是utf-8
相信很多人已经和我这样设置和配置好了,一般的解码编码中文没什么问题。
但是坑该来的还是来了。
我在及在爬取知乎的时候,发现知乎请求返回的json串中的中文用了Unicode转换。还是出现了
Decode error - output not utf-8问题。


Decode error - output not utf-8问题

import requests
import ConfigParser
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

print sys.getdefaultencoding()
print sys.stdin.encoding
print sys.stdout.encoding

f='\u56fd\u5185\u6709\u54ea\u4e9b\u51b7\u95e8\u4f46\u6709\u7279\u8272\u7684\u65c5\u6e38\u5730\u70b9\uff1f'  
print(f.decode('unicode-escape'))

当我这样输出的时候,发现解码是有问题的。现在是把Unicode转换成中文,可以使用decode('unicode-escape')。
但是出现了Decode error - output not utf-8
最让人蛋疼的是,有时是正常可以输出中文——国内有哪些冷门但有特色的旅游地点?有时报Decode error - output not utf-8错误。


然后后面直接在dos窗口和Eclipse的pydev环境下运行,都是正常的。


Decode error - output not utf-8问题原因

原因在哪里呢?
注意,我写多了两句。

print sys.stdin.encoding
print sys.stdout.encoding

在sublime text2输出的是None None
在Eclipse 输出的是     UTF-8 UTF-8
在dos 输出的是         CP936 CP936
这两句指的是输入和输出的编码。所以sublime下clt+b的运行时的这两者编码是未知的。


解决办法

暂时没有好的方法。
蹊跷的是,我发现了这样写可以不会再报这个错误。

import requests
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

print sys.getdefaultencoding()
print sys.stdin.encoding
print sys.stdout.encoding

f='\u56fd\u5185\u6709\u54ea\u4e9b\u51b7\u95e8\u4f46\u6709\u7279\u8272\u7684\u65c5\u6e38\u5730\u70b9\uff1f'  
print type(f.decode('unicode-escape'))
f='\u56fd\u5185\u6709\u54ea\u4e9b\u51b7\u95e8\u4f46\u6709\u7279\u8272\u7684\u65c5\u6e38\u5730\u70b9\uff1f'  
print(f.decode('unicode-escape'))

输出type是'unicode',后面的解码不再报错。至于为什么这样我也想不明白,但是sublime调了一些快捷键之后,用得比较爽。
如果不想这样的话可以换个IDE。

1
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

linux系统下SVN同步文件到WEB目录

SVN在团队开发中使用非常普遍,是一个很方便的版本控制系统。  如果要是能将SVN服务器上的数据自动发布到Web服务器,那将是整个项目开发、测试更加便捷。利用SVN的hook功能就能实现将SVN服务...
  • yufengicd
  • yufengicd
  • 2013-03-15 11:15
  • 3699

websocket:数组转换成websocket数据

这是我写即时聊天遇到的问题。 如果是简单的即时聊天,可以直接返回字符串。但是我的聊天信息要从数据库获得,所以就要用到数组了。其实也很简单,就是把数组转换成json数据就可以了,然后再用websocke...
  • lihaitao_1
  • lihaitao_1
  • 2015-08-24 14:00
  • 1950

Qt与MSVC中文乱码问题的解决方案

一、问题是什么? 在学习Qt编程的过程中,大多数人都遇到过中文乱码的问题。总结起来有三类: 1. Qt Creator中显示的汉字变为乱码,编辑器上方有“Could not decode ...
  • imxiangzi
  • imxiangzi
  • 2016-03-02 17:10
  • 4420

python+sublime text2中文乱码[Decode error - output not utf-8]

标签: python sublime 中文乱码   转自: http://blog.sina.com.cn/s/blog_765abd7b0101dtbw.html 以...
  • howeblue
  • howeblue
  • 2014-04-28 08:42
  • 10406

Sublime Text [Decode error - output not utf-8]

问题: Sublime Text 在build Python时,如果python源代码里有中文,例如“print(‘中文’)”,Sublime Text 会报 [Decode error ...
  • zyq522376829
  • zyq522376829
  • 2015-06-27 23:21
  • 719

Sublime Text 2/3 [Decode error - output not utf-8]

问题: Sublime Text 在build Python时,如果python源代码里有中文,例如“print(‘中文’)”,Sublime Text 会报 [Decode error - ou...
  • wangtaoking1
  • wangtaoking1
  • 2014-12-11 23:16
  • 7992

sublime text编译时提示错误[Decode error - output not utf-8] compilation terminated

sublime text编译时提示错误[Decode error - output not utf-8] compilation terminated 已解决!
  • lhshu2008
  • lhshu2008
  • 2014-01-24 15:57
  • 16263

Sublime text 2/3 [Decode error - output not utf-8] 完美解决方法

sublime text有时运行会输出以下错误信息: [Decode error - output not utf-8]或者[Decode error - output not gbk] ...
  • u011127019
  • u011127019
  • 2016-08-05 17:39
  • 534

Could not decode a text frame as UTF-8 的解决

我准备用谷歌的protobuf作为前后端通信的协议。 但是从服务器发送Message对象到web的时候爆了这个错。很奇怪是什么意思,我明明发的是二进制数据啊,何来的text。。。。 我想起来我在服务...
  • yyf1990cs
  • yyf1990cs
  • 2016-03-19 22:51
  • 3951

PHP字符编码(UTF-8/GBK)与json_encode/json_decode的关系

在项目中,因为字符编码的问题,踩了不少坑,之前踩,现在还接着踩,现在把它们总结出来,只希望以后不要再踩这坑了,我把我踩过的坑总结一下:   1)将数组转成json数据,json数据为null或为空字...
  • lml200701158
  • lml200701158
  • 2016-09-25 18:34
  • 749
    个人资料
    • 访问:1246158次
    • 积分:9872
    • 等级:
    • 排名:第2058名
    • 原创:132篇
    • 转载:7篇
    • 译文:9篇
    • 评论:520条
    博客专栏
    My GitHub