python3還會有中文輸出亂碼問題

2021-08-19 20:30:50 字數 2250 閱讀 3025

這篇文章是以前重構乙個python2專案為python3時遇到的乙個問題,當時記錄下來沒有發表,現在發表在這裡存檔。

眾所周知,python3相比python2的乙個最大的改變就是str統一是unicode編碼的,帶有中文的字串再也不用寫成  u'中文' 這麼麻煩,但是最近卻遇到了 print('中文')  報錯

unicodeencodeerror: 'ascii' codec can't encode characters in position 157-158: ordinal not in range(128)
這個問題只發生在生產環境上,本地環境沒有問題。那麼首先考慮的就是生產環境和本地環境差別在**了-----啟動方式。

生產環境上使用了 uwsgi 來做伺服器處理web請求,而本地環境不是。

嘗試在 uwsgi 配置檔案中加入編碼設定:

[uwsgi] 

.....

env=lc_all=zh_cn.utf-8

....

重啟,報錯again!

再看 pep3333

真相好像已經若隱若現了?慢著,因為經過嘗試,直接使用 uwsgi 啟動專案 print 是能正常工作的,而使用 runit 就報錯了。

注意最後一段

must 

be of type bytes under python 3, and str in earlier versions of python.」

結合python 的 print 函式**說明,pritn 預設是輸出到 sys.stdout

def print(self, *args, sep=' ', end='\n', file=none): # known special case of print

"""print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=false)

prints the values to a stream, or to sys.stdout by default.

optional keyword arguments:

file: a file-like object (stream); defaults to the current sys.stdout.

sep: string inserted between values, default a space.

flush: whether to forcibly flush the stream.

"""pass

經過不懈努力,終於在 pep3333 文件中發現了這麼一段

import os, sys

enc, esc = sys.getfilesystemencoding(), 'surrogateescape'

def unicode_to_wsgi(u):

# convert an environment variable to a wsgi "bytes-as-unicode" string

return u.encode(enc, esc).decode('iso-8859-1')

def wsgi_to_bytes(s):

return s.encode('iso-8859-1')

environ =

environ['wsgi.input'] = sys.stdin.buffer

感覺和 sys.getfilesystemencoding() 有莫大的關係!然後去google尋找蛛絲馬跡~~最後還是在萬能的 stackoverflow 上找到了相關的

=>

最後使用的解決方法

在再生產環境系統中嘗試列印出 stdout 的編碼

import sys

print(sys.stdout.encoding)

# ansi_x3.4-1968

而在其他沒有使用 runit 的環境列印出的是 utf-8 。

最後,在 uwsgi 的配置檔案中加入一句,用來設定python使用的編碼格式。

env = lc_ctype=zh_cn.utf-8
啟動專案!! 中文正常輸出!!!

就像文章最後說的

but where the hell is this documented!

-------------------

xlaoyu.info

python3 輸出中文到csv顯示亂碼

想要儲存對新聞頁面的解析結果,安裝資料庫一直沒有成功,所以打算先存入csv檔案試試,就出現了編碼的問題,初始 是 儲存解析到的內容 with open news detail.csv w newline encoding utf 8 as file fieldnames title author p...

python3中文長度 python3獲得漢字長度

import string def str count str 找出字串中的中英文 空格 數字 標點符號個數 count en count dg count sp count zh count pu 0 for s in str 英文 if s in string.ascii letters cou...

python3輸入輸出

模 式 描 述 r以唯讀方式開啟檔案。檔案的指標將會放在檔案的開頭。這是預設模式。rb以二進位制格式開啟乙個檔案用於唯讀。檔案指標將會放在檔案的開頭。這是預設模式。r 開啟乙個檔案用於讀寫。檔案指標將會放在檔案的開頭。rb 以二進位制格式開啟乙個檔案用於讀寫。檔案指標將會放在檔案的開頭。w開啟乙個檔...