1. 程式人生 > >Python3 編碼問題:UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f621' in posit

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