python入門教程06-01(python語法入門之字符編碼)

2020-12-22 上海老男孩教育

人在與計算機交流的時候,用的都是人類能讀懂的字符,如中文字符、英文字符、日文字符等毫無疑問,由人類的字符到計算機中的數字,必須經歷一個過程,計算機所識別出來的文字都是二進位的0011等等,所以此次課程講的是字符編碼的介紹和如何深刻認識字符編碼?

一 引入

字符串類型、文本文件的內容都是由字符組成的,但凡涉及到字符的存取,都需要考慮字符編碼的問題。

字符編碼這個知識點的典型特徵就是理論多、結論少,但對於開發而言只需要記住結論即可,下面讓我們來一點點介紹它

二 知識儲備

2.1 三大核心硬體

所有軟體都是運行硬體之上的,與運行軟體相關的三大核心硬體為cpu、內存、硬碟,我們需要明確三點

#1、軟體運行前,軟體的代碼及其相關數據都是存放於硬碟中的#2、任何軟體的啟動都是將數據從硬碟中讀入內存,然後cpu從內存中取出指令並執行#3、軟體運行過程中產生的數據最先都是存放於內存中的,若想永久保存軟體產生的數據,則需要將數據由內存寫入硬碟

2.2 文本編輯器讀取文件內容的流程

#階段1、啟動一個文件編輯器(文本編輯器如nodepad++,pycharm,word)#階段2、文件編輯器會將文件內容從硬碟讀入內存#階段3、文本編輯器會將剛剛讀入內存中的內容顯示到屏幕上

2.3 python解釋器執行文件的流程

以python test.py為例,執行流程如下

#階段1、啟動python解釋器,此時就相當於啟動了一個文本編輯器#階段2、python解釋器相當於文本編輯器,從硬碟上將test.py的內容讀入到內存中#階段3、python解釋器解釋執行剛剛讀入的內存的內容,開始識別python語法

2.4 總結

python解釋器與文件本編輯的異同如下

#1、相同點:前兩個階段二者完全一致,都是將硬碟中文件的內容讀入內存,詳解如下python解釋器是解釋執行文件內容的,因而python解釋器具備讀py文件的功能,這一點與文本編輯器一樣#2、不同點:在階段3時,針對內存中讀入的內容處理方式不同,詳解如下文本編輯器將文件內容讀入內存後,是為了顯示或者編輯,根本不去理會python的語法,而python解釋器將文件內容讀入內存後,可不是為了給你瞅一眼python代碼寫的啥,而是為了執行python代碼、會識別python語法)

三、字符編碼介紹

3.1 什麼是字符編碼?

人類在與計算機交互時,用的都是人類能讀懂的字符,如中文字符、英文字符、日文字符等

而計算機只能識別二進位數,詳解如下

#二進位數即由0和1組成的數字,例如010010101010。計算機是基於電工作的,電的特性即高低電平,人類從邏輯層面將高電平對應為數字1,低電平對應為數字0,這直接決定了計算機可以識別的是由0和1組成的數字

毫無疑問,由人類的字符到計算機中的數字,必須經歷一個過程,如下

翻譯的過程必須參照一個特定的標準,該標準稱之為字符編碼表,該表上存放的就是字符與數字一一對應的關係。

字符編碼中的編碼指的是翻譯或者轉換的意思,即將人能理解的字符翻譯成計算機能識別的數字

3.2 字符編碼表的發展史 (了解)

字符編碼的發展經歷了三個重要的階段,如下

3.2.1 階段一:一家獨大

現代計算機起源於美國,所以最先考慮僅僅是讓計算機識別英文字符,於是誕生了ASCII表

# ASCII表的特點: 1、只有英文字符與數字的一一對應關係

2、一個英文字符對應1Bytes,1Bytes=8bit,8bit最多包含256個數字,可以對應256個字符,足夠表示所有英文字符

3.2.2 階段二:諸侯割據、天下大亂

為了讓計算機能夠識別中文和英文,中國人定製了GBK

# GBK表的特點: 1、只有中文字符、英文字符與數字的一一對應關係

2、一個英文字符對應1Bytes

一個中文字符對應2Bytes

補充說明:

1Bytes=8bit,8bit最多包含256個數字,可以對應256個字符,足夠表示所有英文字符

2Bytes=16bit,16bit最多包含65536個數字,可以對應65536個字符,足夠表示所有中文字符

每個國家都各自的字符,為讓計算機能夠識別自己國家的字符外加英文字符,各個國家都制定了自己的字符編碼表

# Shift_JIS表的特點: 1、只有日文字符、英文字符與數字的一一對應關係# Euc-kr表的特點: 1、只有韓文字符、英文字符與數字的一一對應關係

此時,美國人用的計算機裡使用字符編碼標準是ASCII、中國人用的計算機裡使用字符編碼標準是GBK、日本人用的計算機裡使用字符編碼標準是Shift_JIS,如下圖所示,

字符編碼發展到了這個階段,可以用一句話概括:諸侯割據、天下大亂,詳解如下

圖1中,文本編輯存取文件的原理如下

文本文件內容全都為字符,無論存取都是涉及到字符編碼問題#1、存文本文件人類通過文本編輯器輸入的字符會被轉化成ASCII格式的二進位存放於內存中,如果需要永久保存,則直接將內存中的ASCII格式的二進位寫入硬碟#2、讀文本文件直接將硬碟中的ASCII格式的二進位讀入內存,然後通過ASCII表反解成英文字符

圖2圖3都是相同的過程,此時無論是存還是取由於採用的字符編碼表一樣,所以肯定不會出現亂碼問題,但問題是在美國人用的計算機裡只能輸入英文字符,而在中國人用的計算機裡只能輸入中文字符和英文字符....,毫無疑問我們希望計算機允許我們輸入萬國字符均可識別、不亂碼,而現階段計算機採用的字符編碼ASCII、GBK、Shift_JIS都無法識別萬國字符,所以我們必須定製一個兼容萬國字符的編碼表,請看階段三

3.2.3 階段三:分久必合

unicode於1990年開始研發,1994年正式公布,具備兩大特點:

#1. 存在所有語言中的所有字符與數字的一一對應關係,即兼容萬國字符#2. 與傳統的字符編碼的二進位數都有對應關係,詳解如下

很多地方或老的系統、應用軟體仍會採用各種各樣傳統的編碼,這是歷史遺留問題。此處需要強調:軟體是存放於硬碟的,而運行軟體是要將軟體加載到內存的,面對硬碟中存放的各種傳統編碼的軟體,想讓我們的計算機能夠將它們全都正常運行而不出現亂碼,內存中必須有一種兼容萬國的編碼,並且該編碼需要與其他編碼有相對應的映射/轉換關係,這就是unicode的第二大特點產生的緣由

文本編輯器輸入任何字符都是最新存在於內存中,是unicode編碼的,存放於硬碟中,則可以轉換成任意其他編碼,只要該編碼可以支持相應的字符

# 英文字符可以被ASCII識別英文字符--->unciode格式的數字--->ASCII格式的數字# 中文字符、英文字符可以被GBK識別中文字符、英文字符--->unicode格式的數字--->gbk格式的數字# 日文字符、英文字符可以被shift-JIS識別日文字符、英文字符--->unicode格式的數字--->shift-JIS格式的數字

3.3 編碼與解碼

由字符轉換成內存中的unicode,以及由unicode轉換成其他編碼的過程,都稱為編碼encode

由內存中的unicode轉換成字符,以及由其他編碼轉換成unicode的過程,都稱為解碼decode

在諸多文件類型中,只有文本文件的內存是由字符組成的,因而文本文件的存取也涉及到字符編碼的問題

3.4 utf-8的由來

注意:如果保存到硬碟的是GBK格式二進位,當初用戶輸入的字符只能是中文或英文,同理如果保存到硬碟的是Shift_JIS格式二進位,當初用戶輸入的字符只能是日文或英文……如果我們輸入的字符中包含多國字符,那麼該如何處理?

#多國字符—√—》內存(unicode格式的二進位)——X—》硬碟(GBK格式的二進位)#多國字符—√—》內存(unicode格式的二進位)——X—》硬碟(Shift_JIS格式的二進位)#多國字符—√—》內存(unicode格式的二進位)——√—》硬碟(???格式的二進位)

理論上是可以將內存中unicode格式的二進位直接存放於硬碟中的,但由於unicode固定使用兩個字節來存儲一個字符,如果多國字符中包含大量的英文字符時,使用unicode格式存放會額外佔用一倍空間(英文字符其實只需要用一個字節存放即可),然而空間佔用並不是最致命的問題,最致命地是當我們由內存寫入硬碟時會額外耗費一倍的時間,所以將內存中的unicode二進位寫入硬碟或者基於網絡傳輸時必須將其轉換成一種精簡的格式,這種格式即utf-8(全稱Unicode Transformation Format,即unicode的轉換格式)

# 多國字符—√—》內存(unicode格式的二進位)——√—》硬碟(utf-8格式的二進位)

那為何在內存中不直接使用utf-8呢?

utf-8是不定長的:一個英文字符佔1Bytes,一個中文字符佔3Bytes,生僻字用更多的Bytes存儲

也就意味著如果用戶輸入的字符是:你y好,在內存中需要先經歷計算的過程:「你」應該用3Bytes,「y」應該用1Bytes,「好」應該用3Bytes,然後才能存儲,所以內存中如果直接使用utf-8格式去存儲字符,耗費的總時間=計算時間+存儲時間,而內存中使用定長的unicode格式存儲字符,就省去了計算時間,所以內存中使用unicode來存儲字符會浪費空間,但是會提升速度,這是一種用空間換時間的方法

四 字符編碼的應用

我們學習字符編碼就是為了存取字符時不發生亂碼問題:

#1、內存中固定使用unicode無論輸入任何字符都不會發生亂碼#2、我們能夠修改的是存/取硬碟的編碼方式,如果編碼設置不正確將會出現亂碼問題。亂碼問題分為兩種:存亂了,讀亂了#2.1 存亂了:如果用戶輸入的內容中包含中文和日文字符,如果單純以shift_JIS存,日文可以正常寫入硬碟,而由於中文字符在shift_jis中沒有找到對應關係而導致存亂了#2.2 讀亂了:如果硬碟中的數據是shift_JIS格式存儲的,採GBK格式讀入內存就讀亂了

總結:

#1. 保證存的時候不亂:在由內存寫入硬碟時,必須將編碼格式設置為支持所輸入字符的編碼格式#2. 保證存的時候不亂:在由硬碟讀入內存時,必須採用與寫入硬碟時相同的編碼格式

4.1 文本編輯器nodpad++存取文本文件

文本編輯器存取的都是文本文件,而文本文件中包含的內容全為字符,所以存取文本文件都涉及到字符編碼的問題。

4.2 python解釋器執行文件的前兩個階段

執行py文件的前兩個階段就是python解釋器讀文本文件的過程,與文本編輯讀文本文件的前兩個階段沒人任何區別,要保證讀不亂碼,則必須將python解釋器讀文件時採用的編碼方式設置為文件當初寫入硬碟時的編碼格式,如果沒有設置,python解釋器則才用默認的編碼方式,在python3中默認為utf-8,在python2中默認為ASCII,我們可以通過指定文件頭來修改默認的編碼

在文件首行寫入包含#號在內的以下內容

# coding: 當初文件寫入硬碟時採用的編碼格式

解釋器會先用默認的編碼方式讀取文件的首行內容,由於首行是純英文組成,而任何編碼方式都可以識別英文字符。

4.3 python解釋器執行文件的第三個階段

設置文件頭的作用是保證運行python程序的前兩個階段不亂碼,經過前兩個階段後py文件的內容都會以unicode格式存放於內存中。

在經歷第三個階段時開始識別python語法,當遇到特定的語法name = '上'(代碼本身也都全都是unicode格式存的)時,需要申請內存空間來存儲字符串'上',這就又涉及到應該以什麼編碼存儲『上』的問題了。

在Python3中,字符串類的值都是使用unicode格式來存儲

由於Python2的盛行是早於unicode的,因此在Python2中是按照文件頭指定的編碼來存儲字符串類型的值的(如果文件頭中沒有指定編碼,那麼解釋器會按照它自己默認的編碼方式來存儲『上』),所以,這就有可能導致亂碼問題

# coding:utf-8x = '上' # x的值為untf-8格式的二進位print(x) # 列印操作是將x的值,即utf-8格式的二進位交給終端,當終端收到後發現並不是unicode(只有unicode才與字符有對應關係),所以終端會執行操作:utf-8二進位---解碼-->unicode格式的二進位,解碼的過程終端會採用自己默認的編碼,而在pycharm的終端默認編碼為utf-8、windows下的cmd終端的默認編碼為gbk,所以該列印操作在pycharm中顯示正常,而在windows下的cmd中則亂碼# 在windows下的cmd中運行效果如下C:\Users\Administrator>python2 E:\aaa.py

python2後推出了一種補救措施,就是在字符串類型前加u,則會將字符串類型強制存儲unicode,這就與python3保持一致了,對於unicode格式無論丟給任何終端進行列印,都可以直接對應字符不會出現亂碼問題

# coding:utf-8x = u'上' # 即便文件頭為utf-8,x的值依然存成unicode

4.4 字符串encode編碼與decode解碼的使用

# 1、unicode格式------編碼encode-------->其它編碼格式>>> x='上' # 在python3在'上'被存成unicode>>> res=x.encode('utf-8')>>> res,type(res) # unicode編碼成了utf-8格式,而編碼的結果為bytes類型,可以當作直接當作二進位去使用(b'\xe4\xb8\x8a', <class'bytes'>)# 2、其它編碼格式------解碼decode-------->unicode格式>>> res.decode('utf-8') '上'

相關焦點

  • python入門教程06-02(python語法入門之文件處理)
    上一章講解了python的字符編碼,了解了python的字符代碼結構之後就需要了解一下python這門語言是如何處理你給的命令,怎麼去處理文件的,下面我們來了解一二。一 引入應用程式運行過程中產生的數據最先都是存放於內存中的,若想永久保存下來,必須要保存於硬碟中。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐
  • 《小灰教你零基礎學python》-Python入門語言
    程式語言有很多,咱們就學簡單強大的python即可。Python是一種清晰而強大的面向對象程式語言,不過還沒入門的小白不要想多了哈,不是你的對象(女朋友?)Python目前是分成2個大版本,python2 和python3,python是完全免費的,所以不用擔心版權問題,因為python2已經廢棄,所以咱們這套課程完全基於python3。
  • 用python做個自我介紹(python入門教程)_邏輯教育
    本文涉及的python基礎語法為:數據類型等數字類型1. 字符串的拼接我們在上一章中已經簡單介紹了一下字符串的創建方式,這裡我們簡單學習一下字符串的運算和拼接。數據類型的轉換當我們想要print('秦始皇生於公元前' + 259 + '年 ' )時,我們發現出現了一下錯誤這是因為字符串和數字不能用普通的拼接方式,需要進行類型轉換才行。
  • 零基礎快速入門python教程,結合新手練習的5大項目
    即使有語法錯誤,或者異常,如果程序邏輯沒有執行到,就不會有錯誤.比如一個if分支中有語法錯誤,使用了未定義的函數,但如果未執行到此分支,就可以正常運行.動態的另外一層意思就是它的類型是動態的,也就是說無需指定變量的類型,在運行時,根據它的內容來決定的類型.
  • 如何快速學會Python爬蟲(入門篇)
    Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • python 爬蟲學習路線:從入門到進階
    這裡給你一條平滑的、快速入門的學習路徑。本文依舊需要有一些python基礎,至少要求掌握python語法。前置條件:python開發環境首先,學習python爬蟲,需要會:自己安裝python,python庫以及自己的編輯器。
  • Python開發簡單爬蟲【學習資料總結】
    四、網頁解析器和BeautifulSoup 網頁解析器從HTML網頁字符串中提取出價值數據和新URL對象。 BeautifulSoup語法.png 訪問節點信息 五、實戰練習
  • 跟我學解Python題-字符串,輸入任意字符,去除字符中的數字
    首先,我們要知道,我們在 python中進場使用input()輸入函數,使用input()輸入的內容為字符傳類型。在這個前提下我們來看下面這道題目。#Python入門教程#編輯程序 實現功能,輸入字符串(字母和數字例如:qwe123),將字符串中的數字去掉後輸出字符串或列表。
  • Python爬蟲入門教程:超級簡單的Python爬蟲教程
    這是一篇詳細介紹 Python 爬蟲入門的教程,從實戰出發,適合初學者。讀者只需在閱讀過程緊跟文章思路,理清相應的實現代碼,30 分鐘即可學會編寫簡單的 Python 爬蟲。這篇 Python 爬蟲教程主要講解以下 5 部分內容:了解網頁;使用 requests 庫抓取網站數據;
  • python爬蟲100個入門項目
    爬蟲教程,帶你從零到一14豆瓣讀書的爬蟲15鏈家網和貝殼網房價爬蟲16雪球網股票超級爬蟲17Python爬蟲,京東自動登錄,在線搶購商品18cnblog19caoliu45新聞監控46你好汙啊47ofo共享單車爬蟲48QQ空間49QQ 群50清華大學網絡學堂爬蟲整理不易,希望大家多多支持,文章最後有供大家入門學習到進階的學習資料免費無償給大家
  • python與c語言的語法有哪些不一樣的
    在眾多程式語言之中,想必很多人都聽說過Python和C語言,在進行編程學習之前,大家都會問:python和c語言的區別有哪些?我該如何選擇?接下來我們來看看吧。python與C的區別如下:1、語言類型:Python是一種基於解釋器的語言,會逐行讀取代碼,將Python編譯為字節碼,由大型C程序解釋;C是一種編譯語言,完整的原始碼將直接編譯為機器代碼,由CPU直接執行。
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?網絡爬蟲,也叫作網絡數據採集,是指通過編程從Web伺服器請求數據(HTML表單),然後解析HTML以提取所需的數據。想要入門Python 爬蟲首先需要解決四個問題:1.熟悉python編程2.了解HTML3.了解網絡爬蟲的基本原理4.學習使用python爬蟲庫1、
  • Python最佳經典學習路線
    如何學習Python python語言基礎:(帶你熟悉python語言的特性,學會使用python開發環境,使用python開發一些簡單的案例) (1)Python3入門,數據類型,字符串 (2)判斷/循環語句,函數,
  • python入門第八課:while循環和用戶輸入
    本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes本節介紹python中如何與用戶進行交互,同時學習另外一個循環運算符while。\n')print('大家好,他叫',name)簡單說明一下input()函數的用法:1、input(『這是一串提示信息』)括號中的字符串是顯示在屏幕上的提示信息,需要我們自己寫,提示信息應當寫清楚
  • 教你學習:Python-100-Days-01
    教你學習:Python-100-Days-01 本項目是參考項目內容,進行個人理解,和原有項目有出入,如想了解詳情,請自行百度去搜索項目為什麼用Python?python是腳本語言,學習簡單。包含很多環境的數學包,可以簡化我們的開發,方便我們數學計算。未來是數據的時代,java和python是必須要會的語言,是人工智慧和大數據的基礎。
  • python教程之python數學運算
    中進行分數(fraction)運算分數運算是python中的一個模塊(module)。模塊是由別人寫的,並且可以被拿來直接使用的代碼程序,包括類、函數以及標籤的定義,是python標準函數庫的一部分。使用是必須先插入模塊。
  • Python如何入門?直接按這個方式玩炸彈超人小遊戲,就能掌握編程
    還在從基礎知識點開始學python嗎?還不如直接玩python小遊戲炸彈超人,跟著詳細教程開始,從不會python到掌握python基礎知識點,並且還有所有源碼,想學不會編程都難。下面講一下開發Python小遊戲炸彈超人的大致步驟(在底部直接拿詳細教程和所有源碼)首先是開發工具Python版本:3.6.4相關模塊:Pygame,以及自帶的模塊然後開始搭建相應所需的環境,安裝python並添加到環境變量,pip安裝需要的相關模塊即可。
  • datatype在python專題及常見問題 - CSDN
    title category layout tags date python教程之3基本數據類型 pythonpost 2018-01-29 23:00:24 上篇文章簡單介紹了Python語言的基本語法,以及如何在IDE編寫一個Python程序。
  • python初學者必看的學習路線 Python是近幾年比較火的程式語言
    Python是近幾年比較火的程式語言之一,因為人工智慧的火爆,讓很多人都想從事python開發。很多零基礎學員在學習python的時候都會走一些彎路,下面小編就為大家分享python學習路線圖,幫助零基礎學員在學習的時候少走彎路。 很多人都在問Python學習步驟應該如何安排?