字符編碼是將人類的字符編碼成計算機能識別的數字,這種轉換必須遵循一套固定的標準,該標準無非是人類字符與數字的對應關係,稱之爲字符編碼表。python
計算機由美國人發明,最先的字符編碼爲ASCII,只規定了英文字母數字和一些特殊字符與數字的對應關係。最多隻能用 8 位來表示(一個字節),即:2**8 = 256,因此,ASCII碼最多隻能表示 256 個符號。編程
固然咱們編程語言都用英文沒問題,ASCII夠用,可是在處理數據時,不一樣的國家有不一樣的語言,中國人會加入中文,日本人會在本身的程序中加入日文,韓國人也是。app
可是要表示中文,單拿一個字節表表示一個漢子,是不可能表達完的(連小學生都認識兩千多個漢字),解決方法只有一個,就是一個字節用>8位2進製表明,位數越多,表明的變化就多,這樣,就能夠儘量多的表達出不通的漢字。編程語言
因此中國人規定了本身的標準gb2312編碼,規定了包含中文在內的字符與數字的對應關係。編輯器
日本人規定了本身的Shift_JIS編碼;韓國人規定了本身的Euc-kr編碼(另外,韓國人說,計算機是他們發明的,要求世界統一用韓國編碼,但世界人民沒有搭理他們)。學習
這時候問題出現了,精通18國語言的小周同窗謙虛的用8國語言寫了一篇文檔,那麼這篇文檔,按照哪國的標準,都會出現亂碼(由於此刻的各類標準都只是規定了本身國家的文字在內的字符跟數字的對應關係,若是單純採用一種國家的編碼格式,那麼其他國家語言的文字在解析時就會出現亂碼)。因此迫切須要一個世界的標準(能包含全世界的語言)因而Unicode應運而生(韓國人表示不服,而後沒有什麼卵用)。編碼
ascii用1個字節(8位二進制)表明一個字符;Unicode經常使用2個字節(16位二進制)表明一個字符,生僻字須要用4個字節。操作系統
例:字母x,用ascii表示是十進制的120,二進制0111 1000。3d
漢字中已經超出了ASCII編碼的範圍,用Unicode編碼是十進制的20013,二進制的01001110 00101101。指針
字母x,用Unicode表示二進制0000 0000 0111 1000,因此Unicode兼容ascii,也兼容萬國,是世界的標準。
這時候亂碼問題消失了,全部的文檔咱們都使用可是新問題出現了,若是咱們的文檔通篇都是英文,你用Unicode會比ascii耗費多一倍的空間,在存儲和傳輸上十分的低效。
本着節約的精神,又出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8(Unicode Transformation Format-8)編碼。UTF-8編碼把一個Unicode字符根據不一樣的數字大小編碼成1-6個字節,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
從上面的表格還能夠發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上能夠被當作是UTF-8編碼的一部分,因此,大量只支持ASCII編碼的歷史遺留軟件能夠在UTF-8編碼下繼續工做。
內存中還使用Unicode編碼,是由於歷史遺留問題形成的,可是由於如今寫代碼使用的都是UTF-8代碼,因此之後內存中的代碼都將變成UTF-8代碼,而且之前遺留的各個國家的代碼都將被淘汰,因此將來內存中使用的編碼也將使用UTF-8編碼替代Unicode編碼。
首先明確概念
亂碼的兩種狀況:
存文件時,因爲文件內有各個國家的文字,咱們單以shiftjis去存,
本質上其餘國家的文字因爲在shiftjis中沒有找到對應關係而致使存儲失敗。但當咱們硬要存的時候,編輯並不會報錯(難道你的編碼錯誤,編輯器這個軟件就跟着崩潰了嗎???),但毫無疑問,不能存而硬存,確定是亂存了,即存文件階段就已經發生亂碼,而當咱們用shiftjis打開文件時,日文能夠正常顯示,而中文則亂碼了。
存文件時用utf-8編碼,保證兼容萬國,不會亂碼,而讀文件時選擇了錯誤的解碼方式,好比gbk,則在讀階段發生亂碼,讀階段發生亂碼是能夠解決的,選對正確的解碼方式就ok了。
1.1執行python程序的三個階段
階段二:Python解釋器此時就是一個文本編輯器,負責打開文件test.py,即從硬盤中讀取test.py的內容到內存中
階段三:讀取已經加載到內存的代碼(Unicode編碼格式),而後執行,執行過程當中可能會開闢新的內存空間,好比name="nick
件操做的基礎模式有三種(默認的操做模式爲r模式):
文件讀寫內容的格式有兩種(默認的讀寫內容的模式爲b模式):
須要注意的是:t、b這兩種模式均不能單獨使用,都須要與r/w/a之一連用
r: read,只讀模式,只能讀不能寫,文件不存在時報錯。
f.read()讀取文件指針會跑到文件的末端,若是再一次讀取,讀取的將是空格。
w: 只能寫,不能讀,文件存在的時候回清空文件後再寫入內容;文件不存在的時候會建立文件後寫入內容。
a: 能夠追加。文件存在,則在文件的末端寫入內容;文件不存在的時候會建立文件後寫入內容。
b模式是通用的模式,由於全部的文件在硬盤中都是以二進制的形式存儲的,須要注意的是:b模式讀寫文件,必定不能加上encoding參數,由於二進制沒法再編碼
with open()方法不只提供自動釋放操做系統佔用的方法,而且with open可使用逗號分隔,一次性打開多個文件,實現文件的快速拷貝。
with open('32.txt', 'rb') as fr, \ open('35r.txt', 'wb') as fw: f.write(f.read())