在嘗試前面示例的過程中,我想一定也會有小伙伴嘗試用print來輸出我們熟悉的中文字符嗎痴晦?但很不幸的是南吮,通常是失敗了。比如誊酌,你輸入的是print("你好部凑,世界!")
,然后運行后并沒有如預(yù)期地輸出“你好碧浊,世界涂邀!”的文字,而是一段出錯信息箱锐。
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]
這是因為必孤,在默認(rèn)情況下,Python只支持ASCII編碼的字符瑞躺,這個字符集只包含了英文字母敷搪、數(shù)字以及特殊控制符等,合計127幢哨。當(dāng)我們在其中輸入中文字符的時候赡勘,Python就讀不懂了,這就好像你跟一個沒學(xué)過中文的外國人講普通話捞镰,當(dāng)然就不理解了闸与。
其實這是在字符顯示上的一個歷史遺留問題了毙替,早期的計算機系統(tǒng)資源緊缺,所以在字符這類編碼上能省則省践樱,對于英語而言厂画,ASCII通常也就夠用了。
但是不同國家的計算機系統(tǒng)怎么辦呢拷邢?這里面處理方式就不一樣了袱院,Windows默認(rèn)采用的就是針對各種國家發(fā)行不同字符集版本,比如中國大陸采用的是GB2312瞭稼、GBK忽洛,用它來顯示簡體中文的字符。在臺灣省則采用Big5环肘,顯示的是繁體中文欲虚。但是這樣有一個缺點,不同字符集的軟件與文檔在交流的時候就會出現(xiàn)各種問題悔雹,比如一個Big5字符集的軟件在GB2312的Windows中复哆,相關(guān)字符就無法顯示了。
上面這種方式雖然解決了東亞字符等信息在計算機中的存儲與顯示腌零,但也給不同系統(tǒng)間的數(shù)據(jù)交換帶來了很大的問題梯找。所以后來就出現(xiàn)了統(tǒng)一字符編碼的方案,目前應(yīng)用最廣的就是UTF-8莱没。簡單地說,UTF-8字符集足夠的大酷鸦,除了英文字符與控制指示饰躲,它還有足夠的編碼空間來存儲簡體中文、繁體中文臼隔、日語嘹裂、韓語等的字符,這下問題似乎就簡單了摔握,只要大家都使用UTF-8那就不存在字符間的顯示錯亂問題了寄狼。順便說一下,我們所熟知的Android氨淌、iOS等手機操作系統(tǒng)泊愧,以及Mac、Linux等桌面操作系統(tǒng)盛正,采用的編碼就是UTF-8删咱。
然而,作為世界上使用率最廣的操作系統(tǒng)豪筝,Windows默認(rèn)采用的依然是原先的編碼方案(雖然它在系統(tǒng)中也集成了UTF-8字符讀寫的功能)痰滋,所以這也就造成了很多時候文件交流上的不便摘能。比如,你在Windows上用記事本程序創(chuàng)建的一個文本文件敲街,復(fù)制到Mac中用TextEdit打開的時候团搞,卻可能是亂碼。
如果你沒有接觸過除Windows之外的系統(tǒng)多艇,那么我可以舉一個更常見的例子逻恐。比如下圖是一個用UTF-8編碼的網(wǎng)頁,在正常情況下墩蔓,即以UTF-8編碼打開的時候梢莽,顯示的效果是這樣的。
然而奸披,當(dāng)我們轉(zhuǎn)而用GB18030編碼方案來打開的時候昏名,你就會發(fā)現(xiàn),世道變了阵面,字符亂了轻局。
如果你要體驗一下,可以隨便打開一個網(wǎng)頁样刷,然后在瀏覽器的編碼切換菜單中更換一種編碼方案來瀏覽仑扑。不同的瀏覽器更改編碼方案的操作不一,以QQ瀏覽器為例置鼻,可以右鍵單擊镇饮,選擇”編碼”。
我知道箕母,你可能又有問題了储藐,那既然網(wǎng)頁是UTF-8編碼,而Windows默認(rèn)的不是UTF-8嘶是,那為什么我們的瀏覽器默認(rèn)情況下就可以正常選擇UTF-8來顯示輸出呢钙勃?這是因為,在編寫網(wǎng)頁的HTML文件頭部聂喇,通常會有一個類似于<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
的聲明辖源,這個標(biāo)簽的意思是告訴瀏覽器,當(dāng)前文檔是一個HTML文檔希太,采用的字符集是UTF-8克饶。
作了這么多的鋪墊,差不多是可以介紹如何解決這個問題了誊辉。方法非常的簡單彤路,我們也只需要像HTML文件一樣,在文件的頭部聲明一下這個文檔采用UTF-8編碼(當(dāng)然你要選擇別的編碼也行)就可以了芥映。Python中聲明的格式如下:
# coding: UTF-8
此外洲尊,你也可以用
coding = 編碼方案
的方式來表示远豺。更加規(guī)范的表示方式是# -*- coding: -*-
,這樣在辯識度上更好坞嘀,但從效果上是一樣的躯护。
現(xiàn)在問題就解決了,我們在包含了中文信息的文件頭部增加上面的聲明信息丽涩,保存了就可以正常運行了棺滞。
順便說一下,你設(shè)置了UTF-8格式的編碼方案后矢渊,也需要同時將此文檔另存為UTF-8格式继准。在Sublime Text中,默認(rèn)就已經(jīng)是UTF-8了矮男,但在其它的編輯器里移必,你需要在選項或者保存對話框中選擇一下。以“記事本”為例毡鉴,可以在保存對話框的編碼中選擇“UTF-8”崔泵。
建議閱讀:https://www.python.org/dev/peps/pep-0263/#defining-the-encoding
我有意申請簡書與微博的聯(lián)合認(rèn)證作者,條件之一是寫作的文章需要有2000個喜歡猪瞬,所以你點個贊再走吧憎瘸,也歡迎你訂閱本人編輯的專題