Python3 编码问题:UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f621' in posit

错误描述及分析

最近跑程序遇到一个很神奇的问题,程序在输出的时候,前面都是正常的,但是中间同样的code在执行的时候却报错:
UnicodeEncodeError: ‘ascii’ codec can’t encode character ‘\U0001f621’ in posit

在本地打印出’\U0001f621’,显示是一个愤怒的表情:

print('\U0001f621')

但是同样的code,在服务器上就会报上面的错误;
一开始以为是读写文件的问题,改了超级久,所有编码都改成了utf8,还是不行;
而且提示是ascii,比较好奇这是哪里的编码…

系统编码

报错的字符是一个Unicode字符,查了下发现是python3,只有str和Unicode两种编码,去查了python3的系统编码:

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

系统编码就是utf8, 所以再去设置什么系统编码,文件开头加上‘# coding=utf8’ 对我的问题是没啥帮助;

输入输出编码

既然不是系统编码,而且前面输出都没有问题,所以可能也不是之前读写文件的编码错误,可能是print的时候,也就是标准输入输出的时候编码问题了;那么print的时候做了什么,用的是什么编码呢?
我们已经知道在python3中,输出的时候,会把str/Unicode 变成utf8的编码;来看一下环境中的输出编码是什么:

>>> import sys 
>>> sys.stdout.encoding
'ANSI_X3.4-1968'

emmmm…..果然!!!居然是ansi…

解决方法

这样看来应该就是输入输出print的锅了,那么如何解决呢?
也就是如何修改标准输出编码方式呢?
有如下解决方法:、

PYTHONIOENCODING=utf-8 python code.py
  • 重新定义输出标准
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
sys.stdout.write("Your content....")

Python3 编码学习

默认读者已经了解编码/Unicode/utf8/ASCII/GBK 的基础知识和区别;

在最新的python 3版本中,字符串的类型是str, 在内存中都是以Unicode表示,一个字符对应若干个字节;
如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> '中文'.encode('utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

Reference

[1]https://blog.csdn.net/AckClinkz/article/details/78538462
[2] https://www.cnblogs.com/284628487a/p/5584714.html

  • 10
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值