問(wèn)題描述:
使用python3 sublime3 編譯執(zhí)行python文件
無(wú)法打印中文字符
控制臺(tái)提示
<code>UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)</code>
解決方法
新建build配置文件 并勾選 如下
配置內(nèi)容如下:
<code>
"cmd": ["python3", "-u", "$file"],
"file_regex": "^[ ]File "(...?)", line ([0-9]*)",
"selector": "source.python",
"encoding": "utf8",
"env":{"PYTHONIOENCODING":"utf8"},
"path": "/Library/Frameworks/Python.framework/Versions/3.5/bin"
</code>
比較重要的是這個(gè)配置
<code>"env":{"PYTHONIOENCODING":"utf8"},</code>
它指定了環(huán)境變量中 PYTHONIOENCODING 值為utf8
會(huì)設(shè)置stdin/stdout/stderr 的編碼值為utf8
原因思考
讓我們先跳出sublime 進(jìn)入iTerm
可以看到 無(wú)論是python2 還是python3都可以正常輸出中文沥潭;
我們知道當(dāng)print字符的時(shí)候 需要將傳遞的對(duì)象編碼為bytes
這就涉及到將unicode字符進(jìn)行編碼轉(zhuǎn)換 python2使用的是ASCII編碼 是顯示不出來(lái)漢字的
python3默認(rèn)使用的是utf8 可以正常顯示
這里之所以python2可以正常顯示是因?yàn)樵谳敵龅臅r(shí)候使用了utf8編碼
具體關(guān)于默認(rèn)編碼 輸出輸出包括錯(cuò)誤的編碼格式可以看下圖
這是python2
這是python3
這里我們可以知道python中的輸入輸出使用的編碼方法是由sys.stdin.encoding懒震、sys.stdout.encoding 以及sys.stderr.encoding來(lái)決定的 python2輸入輸出使用的是utf8編碼所以就可以正常顯示了
但是為什么到了sublime中就不行呢转培?
我們?cè)趕ublime中建立一個(gè)測(cè)試文件a.py 打印出它所使用的編碼格式來(lái)看一看
我使用的是python3 可以看到sublime默認(rèn)使用的輸入輸出編碼是US-ASCII(這里可能跟sublime是否漢化有關(guān) 我使用的是從官網(wǎng)上下載的版本)
問(wèn)題原因的就在這里
讓我們總結(jié)一下:
python3在sublime中編譯設(shè)置的輸入輸出以及錯(cuò)誤打印的編碼格式為ASCII 因此我們輸入輸出的中文無(wú)法編碼 所以就出現(xiàn)了
<code>UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)</code>
的錯(cuò)誤
因此只需要配置輸入輸出為utf8編碼就可以了
也就是文章開(kāi)始的解決方案
參考資料:關(guān)于編碼
V2EX討論