2021-05-12 14:32:11
CentOS 6下Python處理utf-8的坑
之前在CentOS 6下部署python3+tornado,處理編碼格式為UTF-8的HTTP請求,但奇怪的發現,將bytes型別的請求內容decode的時候會報解碼錯誤:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
同樣的程式,在Windows和CentOS 7下都是正常的,只在CentOS 6下面有問題。
排查過程
我注意到,錯誤提示是ascii解碼錯誤,難道是預設的編碼方式不是utf-8?一看decode函數定義,預設編碼是utf-8啊,而且在引數中手動指定為utf-8,一樣的報這個錯誤。
把bytes的解碼函數都試了,全都報這個錯,然後突然想到既然是報值域不對,那是不是內容中沒有中文就行了?試了一下全英文,果然可以執行通過了。
接下來就是搜尋解決方案了,網上搜到的方法是,將python的系統預設編碼設為utf8:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
然而,並沒有用,因為我先查了一下預設的編碼,本來就是utf-8
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
這就面臨死結了,後來都忘了是怎麼搜到的,說作業系統的編碼也可能有影響,作業系統不支援utf-8的話,python也是沒法編解碼的。
好吧,locale命令看看,恩,全都是“en_US.UTF-8”,對的啊,是UTF-8,轉碼應該沒問題的。
雖然說應該沒問題,不過還是死馬當活馬醫,改一下吧,設成“zh_CN.UTF-8”,恩,居然好了。。。
解決方案
編輯/etc/sysconfig/i18n,之前是:
LANG="en_US.UTF-8"
SUPPORTED="en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"
對應的改成:
LANG="zh_CN.UTF-8"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"
程式就可以正常執行了。其他的編碼應該也類似,可以通過檢視/usr/share/i18n/SUPPORTED檔案來看系統支援哪些編碼,中文相關的有:
zh_CN.UTF-8 UTF-8
zh_CN.GB18030 GB18030
zh_CN.GBK GBK
zh_CN GB2312
問題雖然解決了,但是原因還是沒想通,utf-8能不能編解碼和區域設定為啥會有聯絡,英文的CentOS 7也沒問題的,老的版本就沒試了,只能理解成是CentOS 6特有的坑了。順便吐槽一下,CentOS 6下面升級gcc-c++到4.8也超折騰,不能yum。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-12/149721.htm
相關文章