Python print报ascii编码异常的靠谱解决办法

之前遇到此异常UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters...,都是用这种方式解决:sys.setdefaultencoding(‘utf-8‘)

今天看到如下文章,阐述了此方式的弊端:

http://blog.ernest.me/post/python-setdefaultencoding-unicode-bytes

但此文章只考虑了未使用第三方库的情况下的解决办法,而第三方库里如果也有print的话,就束手无策了,总不能把第三方的所有print都加上encode吧。

另外此文中说的修改编码为utf8的隐患,其实都是因为没有使用unicode字符串或两种字符串混用而已,如果项目中规定只可使用u‘unicode字符串‘,上述隐患即可基本避免。归根结底最大的风险就是第三方库的不可控,print编码和unicode字符串都不可控,所以不能使用setdefaultencoding。

我这次是在用Java启动python时,print中文,就会报ascii的异常,我发现此种情况下sys.stdout.encoding其实为None,而Ubuntu中普通命令行时此变量则是UTF-8。

那如何修改sys.stdout.encoding呢?(直接修改会报错TypeError: readonly attribute)

所以最终找到http://www.macfreek.nl/memory/Encoding_of_Python_stdout

python2修改方式(python3略不同,原文中也有写)

1 if sys.stdout.encoding != ‘UTF-8‘:
2     sys.stdout = codecs.getwriter(‘utf-8‘)(sys.stdout, ‘strict‘)
3 if sys.stderr.encoding != ‘UTF-8‘:
4     sys.stderr = codecs.getwriter(‘utf-8‘)(sys.stderr, ‘strict‘)

这样就完美解决输出中文时的ascii编码异常了,而且也不用重新设置sys的默认编码。

时间: 2024-10-15 02:33:03

Python print报ascii编码异常的靠谱解决办法的相关文章

Centos 7 python 编译报错 ImportError: No module named six 解决办法

本地编译Open vSwitch时报错 Traceback (most recent call last):   File "./ovsdb/ovsdb-idlc.in", line 8, in <module>     import ovs.json   File "/root/rpmbuild/BUILD/openvswitch-2.6.0/python/ovs/json.py", line 21, in <module>     imp

centos7 python 中文 “UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte...”解决方法

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128) 1. 开始以为是自己写的python有问题,但后来发现同样的代码在其它电脑上运行正常... 2. 按网上说的方法什么load(sys),或者加# -*- coding: utf-8 -*-的方式,虽说都知道是python2年代的东西.但就当病急乱投医了.结果依旧无效. 3. 怀疑CentOS7 的LAN

关于python下安装PIL库遇到的问题及解决办法

关于python下安装PIL库遇到的问题及解决办法 :在下面这个网址下载pipllow(a replacement for PIL) www.lfd.uci.edu... ,我下的版本是Pillow-4.1.1-cp27-cp27m-win32.whl,因为python安装的是32位,所以下载的32... 不过在cmd里用pip install Pillow-4.1.1-cp27-cp27m-win32.whl时候报错:架构不被支持.于是乎网上找了答案,在cmd输入python进入shell环境

linux上项目报错找不到主机名解决办法

项目报错找不到主机名解决办法 有时候我们的项目在本地运行没问题,但部署到linux服务器上就出错了. 报错:java.net.UnknownHostException: 主机名: 主机名  找不到主机名. 解决方法: 修改服务器上/etc/hosts文件 127.0.0.1  localhost  localhost.localdomain 添加所需的主机名称 或者 127.0.0.1  localhost  localhost.localdomain 127.0.0.1  添加所需的主机名称

PHP安装mcrypt.so报错 mcrypt.h not found 的解决办法

报错内容:configure: error: mcrypt.h not found. Please reinstall libmcrypt 网上搜索了很多,包括自带的 yum install libmcrypt libmcrypt-devel,这个是没有效果的. 去SourceForget下载libmcrypt http://sourceforge.net/projects/mcrypt/files/Libmcrypt/ ,最新版是mcrypt 2.6.7.gz.下载下来安装仍旧报错libmcr

[Zend Studio]报错问题,项目无法启动解决办法

今天启动Zend Studio报错了,其实这种事经常发生. 但大多数情况我还是用一种简单粗暴的方法: 方法1.把整个工作区间删除,然后又重新创建每个项目 当然如果这个工作区里面的项目少的话,这么搞没什么.如果多的话挺蛋疼的! 所以建议多设置几个工作区,每个工作区项目数不超过5个!有点跑题了... 方法2.删除下面路径里面的所有.snap文件         C:\Users\xxx用户\Zend\workspaces\xxx工作区\.metadata\.plugins\org.eclipse.c

Navicat 连接MySQL数据库 报错2059 - authentication plugin &#39;caching_sha2_password&#39;的解决办法

#在数据库的命令行中输入以下代码即可解决,密码必须要修改 可以再次执行将密码改回来. use mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法 原文地址:https://www.cnblogs.com/liuha

在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法

一.问题背景 昨天debug代码的时候,突然发现无法启动程序了.每次启动程序的时候均报如下错误:(回家以后重现了下这个问题.发现不同电脑,所在的lib下的文件夹不一样,应该和jdk安装时硬件的情况有关),想要看解决方案的请直接跳到红字部分 二.解决办法 遇到这个问题,先去百度了一下,大概有以下几个办法 1.在C:\Windows\下,删除java.exe程序(尝试了一下,发现我的目录下不存在java程序,跳过) 2.在C:\Windows\System32删除这个目录下的Java.javaw.j

各种编码问题产生原因以及解决办法---------响应编码,请求编码,URL编码

 响应编码 产生原因以及解决办法: 示例: 1 package cn.yzu; 2 import java.io.IOException; 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7