在嘗試前面示例的過(guò)程中,我想一定也會(huì)有小伙伴嘗試用print來(lái)輸出我們熟悉的中文字符嗎?但很不幸的是,通常是失敗了。比如,你輸入的是print("你好,世界!"),然后運(yùn)行后并沒(méi)有如預(yù)期地輸出“你好,世界!”的文字,而是一段出錯(cuò)信息。
File "D:\Dev\python27\1-3printFormat.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file D:\Dev\python27\1-3printFormat.py on line 1,
but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
[Finished in 1.2s with exit code 1]
這是因?yàn)椋谀J(rèn)情況下,Python只支持ASCII編碼的字符,這個(gè)字符集只包含了英文字母、數(shù)字以及特殊控制符等,合計(jì)127。當(dāng)我們?cè)谄渲休斎胫形淖址臅r(shí)候,Python就讀不懂了,這就好像你跟一個(gè)沒(méi)學(xué)過(guò)中文的外國(guó)人講普通話(huà),當(dāng)然就不理解了。
其實(shí)這是在字符顯示上的一個(gè)歷史遺留問(wèn)題了,早期的計(jì)算機(jī)系統(tǒng)資源緊缺,所以在字符這類(lèi)編碼上能省則省,對(duì)于英語(yǔ)而言,ASCII通常也就夠用了。
但是不同國(guó)家的計(jì)算機(jī)系統(tǒng)怎么辦呢?這里面處理方式就不一樣了,Windows默認(rèn)采用的就是針對(duì)各種國(guó)家發(fā)行不同字符集版本,比如中國(guó)大陸采用的是GB2312、GBK,用它來(lái)顯示簡(jiǎn)體中文的字符。在臺(tái)灣省則采用Big5,顯示的是繁體中文。但是這樣有一個(gè)缺點(diǎn),不同字符集的軟件與文檔在交流的時(shí)候就會(huì)出現(xiàn)各種問(wèn)題,比如一個(gè)Big5字符集的軟件在GB2312的Windows中,相關(guān)字符就無(wú)法顯示了。
上面這種方式雖然解決了東亞字符等信息在計(jì)算機(jī)中的存儲(chǔ)與顯示,但也給不同系統(tǒng)間的數(shù)據(jù)交換帶來(lái)了很大的問(wèn)題。所以后來(lái)就出現(xiàn)了統(tǒng)一字符編碼的方案,目前應(yīng)用最廣的就是UTF-8。簡(jiǎn)單地說(shuō),UTF-8字符集足夠的大,除了英文字符與控制指示,它還有足夠的編碼空間來(lái)存儲(chǔ)簡(jiǎn)體中文、繁體中文、日語(yǔ)、韓語(yǔ)等的字符,這下問(wèn)題似乎就簡(jiǎn)單了,只要大家都使用UTF-8那就不存在字符間的顯示錯(cuò)亂問(wèn)題了。順便說(shuō)一下,我們所熟知的Android、iOS等手機(jī)操作系統(tǒng),以及Mac、Linux等桌面操作系統(tǒng),采用的編碼就是UTF-8。
然而,作為世界上使用率最廣的操作系統(tǒng),Windows默認(rèn)采用的依然是原先的編碼方案(雖然它在系統(tǒng)中也集成了UTF-8字符讀寫(xiě)的功能),所以這也就造成了很多時(shí)候文件交流上的不便。比如,你在Windows上用記事本程序創(chuàng)建的一個(gè)文本文件,復(fù)制到Mac中用TextEdit打開(kāi)的時(shí)候,卻可能是亂碼。
如果你沒(méi)有接觸過(guò)除Windows之外的系統(tǒng),那么我可以舉一個(gè)更常見(jiàn)的例子。比如下圖是一個(gè)用UTF-8編碼的網(wǎng)頁(yè),在正常情況下,即以UTF-8編碼打開(kāi)的時(shí)候,顯示的效果是這樣的。

然而,當(dāng)我們轉(zhuǎn)而用GB18030編碼方案來(lái)打開(kāi)的時(shí)候,你就會(huì)發(fā)現(xiàn),世道變了,字符亂了。

如果你要體驗(yàn)一下,可以隨便打開(kāi)一個(gè)網(wǎng)頁(yè),然后在瀏覽器的編碼切換菜單中更換一種編碼方案來(lái)瀏覽。不同的瀏覽器更改編碼方案的操作不一,以QQ瀏覽器為例,可以右鍵單擊,選擇”編碼”。
更換編碼方案
我知道,你可能又有問(wèn)題了,那既然網(wǎng)頁(yè)是UTF-8編碼,而Windows默認(rèn)的不是UTF-8,那為什么我們的瀏覽器默認(rèn)情況下就可以正常選擇UTF-8來(lái)顯示輸出呢?這是因?yàn)椋诰帉?xiě)網(wǎng)頁(yè)的HTML文件頭部,通常會(huì)有一個(gè)類(lèi)似于<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>的聲明,這個(gè)標(biāo)簽的意思是告訴瀏覽器,當(dāng)前文檔是一個(gè)HTML文檔,采用的字符集是UTF-8。
作了這么多的鋪墊,差不多是可以介紹如何解決這個(gè)問(wèn)題了。方法非常的簡(jiǎn)單,我們也只需要像HTML文件一樣,在文件的頭部聲明一下這個(gè)文檔采用UTF-8編碼(當(dāng)然你要選擇別的編碼也行)就可以了。Python中聲明的格式如下:
# coding: UTF-8
此外,你也可以用
coding = 編碼方案的方式來(lái)表示。更加規(guī)范的表示方式是# -*- coding: -*-,這樣在辯識(shí)度上更好,但從效果上是一樣的。
現(xiàn)在問(wèn)題就解決了,我們?cè)诎酥形男畔⒌奈募^部增加上面的聲明信息,保存了就可以正常運(yùn)行了。

順便說(shuō)一下,你設(shè)置了UTF-8格式的編碼方案后,也需要同時(shí)將此文檔另存為UTF-8格式。在Sublime Text中,默認(rèn)就已經(jīng)是UTF-8了,但在其它的編輯器里,你需要在選項(xiàng)或者保存對(duì)話(huà)框中選擇一下。以“記事本”為例,可以在保存對(duì)話(huà)框的編碼中選擇“UTF-8”。

建議閱讀:https://www.python.org/dev/peps/pep-0263/#defining-the-encoding
我有意申請(qǐng)簡(jiǎn)書(shū)與微博的聯(lián)合認(rèn)證作者,條件之一是寫(xiě)作的文章需要有2000個(gè)喜歡,所以你點(diǎn)個(gè)贊再走吧,也歡迎你訂閱本人編輯的專(zhuān)題
