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字符串函數用法大全
    語法:str.capitalize()  —> str 返回字符串程序示例:str1 = "i Love python"str2 = " i Love python"str3 = "I Love python"print(str1.capitalize())print(str2
  • 如何快速學會Python爬蟲(入門篇)
    Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • Python入門小迷宮,走完這個迷宮,就能掌握python編程基礎
    這是一個很神奇的迷宮,走完這個迷宮就能掌握python基礎。其實,這是一個用python做的迷宮小遊戲,非常簡單,但對於python初學者來說,還是有一定的挑戰性,但TONOW有源碼和教程,只要跟著python迷宮小遊戲的教程和相應的源碼,不僅很容易就能自己開發出這個遊戲,還能在這個過程中,掌握python編程的基礎哦!
  • python入門第二課:變量和數據類型
    本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes在Python中,變量可以理解為抽屜,數據就是一個蘋果、香蕉、書本等可以放進抽屜的東西,變量是用來存儲數據的。我們對上一節課的hello world代碼稍加改動,改成下面的代碼,看看會輸出什麼?
  • Python 基礎(字符串)
    python字符串是不可變數據類型,有序數據類型。 I short is Life'一個替換的方法方法語法參數返回值替換str.replace(old, new, count=-1, /)被替換的字符, 用來替換的字符, 替換次數新的字符串對象字符串.replace(被替換的字符, 用來替換的字符, 替換次數)字符串是不可變數據類型,返回新的字符串對象,原來的字符串都是沒有發生變化
  • 如何自學成 Python 大神?這裡有些建議
    在本篇文章中,我們將分享 6 位技術專家學習 Python 的最佳方法,也許當你學習舉步維艱之時,他們的經驗將會幫你躲避很多不必要的坑,以及可以讓你學會如何通過 Python 教程編寫出色的 Python 程序。
  • PythonGuru 中文系列教程·翻譯完成
    在線閱讀 ApacheCN 學習資源 目錄 初級 Python python 入門 安裝 Python3 運行 python 程序 數據類型和變量 Python 數字 Python 字符串 Python 列表 Python 字典 Python 元組 數據類型轉換 Python 控制語句 Python 函數 Python 循環 Python 數學函數 Python
  • 乾貨| 完美Python入門基礎知識點總結
    python的字串列表有2種取值順序從左到右索引默認0開始的,最大範圍是字符串長度少1從右到左索引默認-1開始的,最大範圍是字符串開頭List(列表) 是 Python 中使用最頻繁的數據類型列表可以完成大多數集合類的數據結構實現。
  • python與c語言的語法有哪些不一樣的
    在眾多程式語言之中,想必很多人都聽說過Python和C語言,在進行編程學習之前,大家都會問:python和c語言的區別有哪些?我該如何選擇?接下來我們來看看吧。python與C的區別如下:1、語言類型:Python是一種基於解釋器的語言,會逐行讀取代碼,將Python編譯為字節碼,由大型C程序解釋;C是一種編譯語言,完整的原始碼將直接編譯為機器代碼,由CPU直接執行。
  • 第一個python程序 helloworld
    解釋器交互式集成開發環境IDE ---pycharm01.第一個python程序 helloworld1.pyhon目錄下新建一個 文件 01-python-helloworld.py使用 gedit 輸入以下內容print("hello world!")
  • Python數據分析入門教程(一):獲取數據源
    (4)指定編碼格式Python用得比較多的兩種編碼格式是UTF-8和gbk,默認編碼格式是UTF-8。我們要根據導入文件本身的編碼格式進行設置,通過設置參數encoding來設置導入的編碼格式。你也可以不加encoding參數,因為Python默認的編碼格式就是UTF-8。如果CSV(逗號分隔)(*.csv)格式的文件,那麼在導入的時候就需要把編碼格式更改為gbk,如果使用UTF-8就會報錯。
  • Python新手入門指南
    本教程就是為 Python 新手介紹 pip。通過本教程,你將學到:1. 安裝 Python 的標準發行版中未包含的其他軟體包2. 查找發布於 Python 包索引(PyPI)的包3. 管理腳本和應用程式的安裝需求4.
  • 重磅:包郵寄送《Python數據可視化之美》
    R語言以ggplot2包及其拓展包人性化的繪圖語法大受用戶的喜愛,特別是生物信息與醫學研究者。Rggplot2有兩本很經典的教程:ggplot2 Elegant Graphicsfor Data Analysis和R Graphics Cookbook,兩本書重點介紹了ggplot2包的繪圖語法及常見圖表的繪製方法。
  • 教程|Python Web頁面抓取:循序漸進
    Python是面向對象的語言,而且與其他語言相比,類和對象都更容易操作,所以是Python Web爬蟲最簡單的入門方法之一。此外,還有許多庫能簡化Python Web爬蟲工具的構建流程。這次小Oxy會概述入門所需的知識,包括如何從頁面源獲取基於文本的數據以及如何將這些數據存儲到文件中並根據設置的參數對輸出進行排序。
  • python入門第十三課:文件的讀寫與分析介紹,異常處理和代碼重構
    ##本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes學完前面十二節課,已完成Python編程入門了,我們已經能編寫組織有序而易於使用的Python程序了。接來下繼續學習更多應用操作,比如文件操作、數據存儲、異常處理等,這些技巧能讓我們快速的處理大量的數據,讓程序更加健壯。
  • 【Python基礎】快速入門Python(講解、習題)
    1 Python數據類型1.1 字符串在Python中用引號引起來的字符集稱之為字符串,比如:'hello'、"my Python"、"2+3"等都是字符串 Python中字符串中使用的引號可以是單引號、雙引號跟三引號print ('hello world!')hello world!
  • Python的最佳實踐和技巧,助您快速有效地編碼
    這意味著,需確保自己始終遵循著最佳編碼實踐(對代碼進行注釋、使用正確句法等),反之,則可能會養成一些不良習慣,影響您在編碼行業的未來發展。「通用規範提供了所有的可維護性,清晰性,一致性,也為良好的編程習慣奠定基礎。它不能做的就是違背您的意願,堅持讓您學習它。這就是Python!」
  • Python2 已終結,入手Python 3,你需要這30個技巧
    機器之心選自medium作者:Erik-Jan van Baaren機器之心編譯參與:王子嘉、一鳴Python2 在今年和我們說拜拜了,Python3 有哪些有趣而又實用的技巧呢
  • 職場人士如何一小時學會從0到1用Python
    Python正是因為其簡潔的語法、豐富多樣的處理模塊,成為了一個簡潔且實用的代碼工具。我們在各種場合,多多少少都看到過Python與數據分析的課程,容易產生一種「Pyhon是一把屠龍寶刀,擁有了它自己的職業技能就能上一個臺階的錯覺」。而真正開始學習時,又會因為其運行環境、語法細節、應用場景等問題而不斷受阻,最終不了了之。
  • Python實戰 | 只需 「4步」 入門網絡爬蟲
    1、python的數字類型分為整型、長整型、浮點型、布爾型、複數類型。2、python沒有字符類型3、python內部沒有普通類型,任何類型都是對象。4、如果需要查看變量的類型,可以使用type類,該類可以返回變量的類型或創建一個新的類型。5、python有3種表示字符串類型的方式,即單引號、雙引號、三引號。