解決 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)


最近使用 Flask 把接收到的資料 print 出來時,卻出現了這個錯誤訊息:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

神奇的是,在兩台電腦上測試,卻只有一台出現這個問題,只好繼續追查下去。

然後從 debug 介面中,看到了更詳細的錯誤訊息:

/usr/local/lib/python2.7/dist-packages/werkzeug/filesystem.py:63: BrokenFilesystemWarning: Detected a misconfigured UNIX filesystem: Will use UTF-8 as filesystem encoding instead of 'ANSI_X3.4-1968'  BrokenFilesystemWarning)

簡單來說,問題是因為要印出來的東西包含非 ASCII 字元,但因為 Python IO 編碼設定是 ANSI_X3.4-1968 ,所以就無法印出來。

為了要確定猜想正確,我們可以在 python 中執行:

import sys; print(sys.stdout.encoding)
如果看到 output 是 ANSI_X3.4-1968 ,沒錯,就是因為這個問題了。在我另一台沒有問題的電腦, output 是 UTF-8 。

要處理這個問題也不難,只要讓 Python 知道可以使用 UTF-8 就可以了,我們可以在運行 Python 前先執行:

export PYTHONIOENCODING=UTF-8
這行我會建議寫進 .bashrc 或者放進 /etc/profile.d 中,這樣每次運行 python 前都可以先把 PYTHONIOENCODING 設定成 UTF-8 ,就不會有這個問題了。

參考: https://stackoverflow.com/a/34517230/3721656

留言

這個網誌中的熱門文章

如何在ubuntu中compile kernel(12.10)

如何在linux kernel 3.7中加入system call