2016-12-31 144 views
4

我剛開始學習Python,但是我已經遇到了麻煩。
我那裏有一個命令一個簡單的腳本:Python 3 UnicodeEncodeError:'ascii'編解碼器不能編碼字符

#!/usr/bin/env python3 
print("Příliš žluťoučký kůň úpěl ďábelské ódy.") # Text in Czech 

當我嘗試運行此腳本:

python3 hello.py 

我得到這個消息:

Traceback (most recent call last): 
    File "hello.py", line 2, in <module> 
    print("P\u0159\xedli\u0161 \u017elu\u0165ou\u010dk\xfd k\u016fn \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy.") 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128) 

我使用的Kubuntu 16.04和Python 3.5.2。 當我試過這個:export PYTHONIOENCODING=utf-8它的工作,但只是暫時的。下一次我打開bash,我得到了同樣的錯誤。按照https://docs.python.org/3/howto/unicode.html#the-string-type Python源代碼的默認編碼是UTF-8。
所以我有源文件保存ID UTF-8,Konsole設置爲UTF-8,但我仍然得到錯誤!
即使我添加

# -*- coding: utf-8 -*- 

的開始,它什麼都不做。

另一個奇怪的事情:當我運行它只使用python,而不是python3,它的工作原理。如何在Python 2.7.12而不是3.5.2中工作?

任何想法永久解決這個問題?謝謝。

+1

這聽起來像您的環境不支持UTF-8的正確配置。這就是爲什麼Python在打印Unicode時默認爲'ascii'的原因。 –

+0

寫入文件時可能出現[UnicodeEncodeError]重複(http://stackoverflow.com/questions/32924147/unicodeencodeerror-when-writing-to-file) –

+0

必須打破您的語言環境。也許你的.bashrc設置'LANG = cs_CZ。UTF-8「,但你還沒有建立/安裝捷克語區域?如果您的區域設置損壞或丟失,Python將默認爲ASCII編碼。它在Python 2中工作的原因是因爲該字符串是一個字節字符串,並且將直接寫入您的終端。在寫入終端時,Python 3需要對字符串進行編碼 –

回答

4

感謝馬克託倫阿拉斯泰爾麥科馬克爲暗示問題可能在哪裏。問題確實在現場設置中。
當我跑locale,產量爲:

LANG=C 
LANGUAGE= 
LC_CTYPE="C" 
LC_NUMERIC=cs_CZ.UTF-8 
LC_TIME=cs_CZ.UTF-8 
LC_COLLATE=cs_CZ.UTF-8 
LC_MONETARY=cs_CZ.UTF-8 
LC_MESSAGES="C" 
LC_PAPER="C" 
LC_NAME="C" 
LC_ADDRESS="C" 
LC_TELEPHONE="C" 
LC_MEASUREMENT=cs_CZ.UTF-8 
LC_IDENTIFICATION="C" 
LC_ALL= 

這個「C」是指使用ANSI字符表的默認設置。這就是問題所在。運行locale charmap給了我:ANSI_X3.4-1968它不能顯示非英文字符。
我使用這個Ubuntu documentation site修復了這個問題。

我添加了這些行/etc/default/locale

LANGUAGE=cs_CZ.UTF-8 
LC_ALL=cs_CZ.UTF-8 

然後,你必須重新啓動會話(註銷和)以應用這些設置。

運行locale現在返回的輸出:

LANG=C 
LANGUAGE=cs 
LC_CTYPE="cs_CZ.UTF-8" 
LC_NUMERIC="cs_CZ.UTF-8" 
LC_TIME="cs_CZ.UTF-8" 
LC_COLLATE="cs_CZ.UTF-8" 
LC_MONETARY="cs_CZ.UTF-8" 
LC_MESSAGES="cs_CZ.UTF-8" 
LC_PAPER="cs_CZ.UTF-8" 
LC_NAME="cs_CZ.UTF-8" 
LC_ADDRESS="cs_CZ.UTF-8" 
LC_TELEPHONE="cs_CZ.UTF-8" 
LC_MEASUREMENT="cs_CZ.UTF-8" 
LC_IDENTIFICATION="cs_CZ.UTF-8" 
LC_ALL=cs_CZ.UTF-8 

和運行locale charmap回報:

UTF-8 
相關問題