主頁 > 後端開發 > 【2020Python修煉記13】Python語法入門—字符編碼

【2020Python修煉記13】Python語法入門—字符編碼

2020-10-18 16:51:29 後端開發

一、知識儲備

1、三大核心硬體——CPU,記憶體,硬碟

所有軟體都是運行硬體之上的,與運行軟體相關的三大核心硬體為cpu、記憶體、硬碟

#1、軟體運行前,軟體的代碼及其相關資料都是存放于硬碟中的

#2、任何軟體的啟動都是將資料從硬碟中讀入記憶體,然后cpu從記憶體中取出指令并執行

#3、軟體運行程序中產生的資料最先都是存放于記憶體中的,若想永久保存軟體產生的資料,則需要將資料由記憶體寫入硬碟

 

2、文本編輯器讀取檔案內容的流程

#階段1、啟動一個檔案編輯器(文本編輯器如nodepad++,pycharm,word)

#階段2、檔案編輯器會將檔案內容從硬碟讀入記憶體

#階段3、文本編輯器會將剛剛讀入記憶體中的內容顯示到螢屏上

3、Python解釋器執行檔案的流程

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

#階段1、啟動python解釋器,此時就相當于啟動了一個文本編輯器

#階段2、python解釋器相當于文本編輯器,從硬碟上將test.py的內容讀入到記憶體中

#階段3、python解釋器解釋執行剛剛讀入的記憶體的內容,開始識別python語法

4、總結—Python解釋器&文本編輯器的異同

#1、相同點:

前兩個階段二者完全一致,都是將硬碟中檔案的內容讀入記憶體,詳解如下 python解釋器是解釋執行檔案內容的,因而python解釋器具備讀py檔案的功能,這一點與文本編輯器一樣

#2、不同點:

在階段3時,針對記憶體中讀入的內容處理方式不同,詳解如下——

文本編輯器將檔案內容讀入記憶體后,是為了顯示或者編輯,根本不去理會python的語法,而python解釋器將檔案內容讀入記憶體后,可不是為了給你瞅一眼python代碼寫的啥,而是為了執行python代碼、會識別python語法)

 

二、字符編碼

1、什么是字符編碼

人類在與計算機互動時,用的都是人類能讀懂的字符,如中文字符、英文字符、日文字符等 而計算機只能識別二進制數,

解釋如下:

二進制數即由0和1組成的數字,例如 010010101010,

計算機是基于電作業的,電的特性即高低電平

人類從邏輯層面將高電平對應為數字1,低電平對應為數字0

這直接決定了計算機可以識別的是由0和1組成的數字

 

由人類的字符到計算機中的數字,必須經歷一個程序:

翻譯的程序必須參照一個特定的標準,該標準稱之為字符編碼表

該表上存放的就是字符與數字一 一對應的關系

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

 

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

 

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

 

2.1 階段一:一枝獨秀——ASCII(american standard code for information interchange,美國資訊交換標準代碼)

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

ascii第一次以規范標準的型別發表是在1967年,最后一次更新則是在1986年,共定義了128個字符,

# ascii表的特點: 
1、只有英文字符與數字的一一對應關系 
2、一個英文字符對應1bytes,1bytes=8bit,8bit最多包含256個數字,
可以對應256個字符,足夠表示所有英文字符

 

2.2 階段二:百花齊放,百家爭鳴——GBK,Shift_JIS,Euc-kr

 為了讓計算機能夠識別中文和英文,中國人定制了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、存文本檔案 人類通過文本編輯器輸入的字符會被轉化成ASCII格式的二進制存放于記憶體中,如果需要永久保存,則直接將記憶體中的ASCII格式的二進制寫入硬碟  

#2、讀文本檔案 直接將硬碟中的ASCII格式的二進制讀入記憶體,然后通過ASCII表反解成英文字符

不同國家的字符編碼標準不同,只支持本國語言以及英文,但是若一臺美國電腦想要存盤日文檔案,就無法識別,出現亂碼,

 

2.3 階段三:和諧統一 ——unicode

unicode碼擴展自ascii字元集,是一個編碼方案,unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求,

unicode 編碼共有三種具體實作,分別為utf-8,utf-16,utf-32,其中utf-8占用一到四個位元組,utf-16占用二或四個位元組,utf-32占用四個位元組,unicode 碼在全球范圍的資訊交換領域均有廣泛的應用,

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

#1. 存在所有語言中的所有字符與數字的一一對應關系,即兼容萬國字符

#2. 與傳統的字符編碼的二進制數都有對應關系

文本編輯器輸入任何字符都是最先存在于記憶體中,使用的是unicode編碼,存放于硬碟中,

則可以轉換成任意其他編碼,只要該編碼可以支持相應的字符,

# 英文字符可以被ascii識別

英文字符--->unciode格式的數字--->ascii格式的數字

 

# 中文字符、英文字符可以被gbk識別

中文字符、英文字符--->unicode格式的數字--->gbk格式的數字

 

# 日文字符、英文字符可以被shift-jis識別

日文字符、英文字符--->unicode格式的數字--->shift-jis格式的數字

 

3、編碼與解碼

3.1  由字符轉換成記憶體中的unicode,以及由unicode轉換成其他編碼的程序,都稱為編碼encode

 

3.2 由記憶體中的unicode轉換成字符,以及由其他編碼轉換成unicode的程序,都稱為解碼decode

在諸多檔案型別中,只有文本檔案的記憶體是由字符組成的,因而文本檔案的存取也涉及到字符編碼的問題

 

4、utf-8的由來

如果保存到硬碟的是gbk格式二進制,當初用戶輸入的字符只能是中文或英文

同理如果保存到硬碟的是shift_jis格式二進制,當初用戶輸入的字符只能是日文或英文

如果是多國字符混雜的檔案,該用什么格式的二進制 存入硬碟呢?

 

 

理論上是可以將記憶體中unicode格式的二進制直接存放于硬碟中的,但有兩大缺點——

=1=更費空間

由于unicode固定使用兩個位元組來存盤一個字符,如果多國字符中包含大量的英文字符時,使用unicode格式存放會額外占用一倍空間(英文字符其實只需要用一個位元組存放即可)

=2=更耗時間

空間占用并不是最致命的問題,最致命地是當我們由記憶體寫入硬碟時會額外耗費一倍的時間

 

所以將記憶體中的unicode二進制寫入硬碟或者基于網路傳輸時必須將其轉換成一種精簡的格式,

這種格式即utf-8(全稱unicode transformation format,即unicode的轉換格式

 

 

那為何在記憶體中不直接使用utf-8呢?

utf-8是針對Unicode的可變長度字符編碼:一個英文字符占1Bytes,一個中文字符占3Bytes,生僻字用更多的Bytes存盤 

unicode更像是一個過渡版本,我們新開發的軟體或檔案存入硬碟都采用utf-8格式,

等過去幾十年,所有老編碼的檔案都淘汰掉之后,會出現一個令人開心的場景——

即 硬碟里放的都是utf-8格式,此時unicode便可以退出歷史舞臺,記憶體里也改用utf-8

 

三、字符編碼的應用

 前面一大串的鋪墊,只為了解決這個問題——為了存取字符時不發生亂碼問題

#1、記憶體中固定使用unicode無論輸入任何字符都不會發生亂碼

#2、我們能夠修改的是存/取硬碟的編碼方式,如果編碼設定不正確將會出現亂碼問題,

亂碼問題分為兩種:存亂了,讀亂了

#2.1 存亂了:

如果用戶輸入的內容中包含中文和日文字符,如果單純以shift_jis存,日文可以正常寫入硬碟,而由于中文字符在shift_jis中沒有找到對應關系而導致存亂了

#2.2 讀亂了:

如果硬碟中的資料是shift_jis格式存盤的,采gbk格式讀入記憶體就讀亂了

 因此:

#1. 保證存的時候不亂:在由記憶體寫入硬碟時,必須將編碼格式設定為支持所輸入字符的編碼格式

#2. 保證讀的時候不亂:在由硬碟讀入記憶體時,必須采用與寫入硬碟時相同的編碼格式

3.1 文本編輯器nodpad++存取文本檔案

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

3.2 python解釋器執行檔案

Python3中,特殊情況比如輸入字串,默認的設定就能保住不亂碼,

第一階段——讀取檔案到硬碟

第二階段——在記憶體里默認直接存為Unicode

第三階段——讀檔案,硬碟里默認使用utf-8存盤,讀取到記憶體后轉為Unicode

 

但是如果事先指定了存檔案的編碼(比如:gbk),怎么保證第三個階段讀檔案時不亂碼——修改檔案頭,為一開始指定的編碼即可:

#coding:gbk

 

Python2中,

=保證Python程式前兩個階段不亂碼的方法——

避免讀取檔案亂碼的現象: 先搞清楚 檔案存的時候用的是什么編碼,讀的時候就要用什么編碼,

檔案頭:在檔案開頭宣告存檔案時使用的編碼,讓Python解釋器不要再使用默認的編碼(Python3—默認utf-8;Python2—默認ASCII)來讀檔案,而是用檔案頭宣告的編碼—— 例如,存代碼時,使用的是gbk編碼,則在檔案第一行宣告

#coding:gbk

=保證第三階段不亂碼—— 輸入字串,記得加小u

x=u'上' print(x)

 3.3 字串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')

 

參考資料:

https://zhuanlan.zhihu.com/p/108805502

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/178319.html

標籤:Python

上一篇:python初學者必看學習路線圖!!!

下一篇:《自拍教程42》Python adb一鍵讀取系統版本資訊

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more