日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Python3】Python的字符編碼

 書*金 2017-06-18

一、字符集和字符編碼
1. 定義
計(jì)算機(jī)中儲(chǔ)存的信息都是用二進(jìn)制數(shù)表示的,而我們?cè)谄聊簧峡吹降挠⑽?、漢字等字符是二進(jìn)制數(shù)轉(zhuǎn)換之后的結(jié)果。通俗的說,按照何種規(guī)則將字符存儲(chǔ)在計(jì)算機(jī)中,如'a'用什么表示,稱為"編碼";反之,將存儲(chǔ)在計(jì)算機(jī)中的二進(jìn)制數(shù)解析顯示出來,稱為"解碼",如同密碼學(xué)中的加密和解密。在解碼過程中,如果使用了錯(cuò)誤的解碼規(guī)則,則導(dǎo)致'a'解析成'b'或者亂碼。

字符(Character):是一個(gè)信息單位,在計(jì)算機(jī)里面,一個(gè)中文漢字是一個(gè)字符,一個(gè)英文字母是一個(gè)字符,一個(gè)阿拉伯?dāng)?shù)字是一個(gè)字符,一個(gè)標(biāo)點(diǎn)符號(hào)也是一個(gè)字符。

字符集(Charset):是一個(gè)系統(tǒng)支持的所有抽象字符的集合。通常以二維表的形式存在,二維表的內(nèi)容和大小是由使用者的語言而定,可以是英語,是漢語,或者阿拉伯語。

字符編碼(Character Encoding):是一套法則,使用該法則能夠?qū)ψ匀徽Z言的字符的一個(gè)集合(如字母表或音節(jié)表),與其他東西的一個(gè)集合(如號(hào)碼或電脈沖)進(jìn)行配對(duì)。在這里我們把字符集中的字符編碼為特定的二進(jìn)制數(shù),以便在計(jì)算機(jī)中存儲(chǔ)。編碼方式一般就是對(duì)二維表的橫縱坐標(biāo)進(jìn)行變換的算法。即在符號(hào)集合與數(shù)字系統(tǒng)之間建立對(duì)應(yīng)關(guān)系,它是信息處理的一項(xiàng)基本技術(shù)。即:字符--------(翻譯過程)------->二進(jìn)制數(shù)

2. 常用的字符集和字符編碼
字符集和字符編碼一般都是成對(duì)出現(xiàn)的,如ASCII、GBK、Unicode、UTF-8等,都是即表示了字符集又表示了對(duì)應(yīng)的字符編碼,以后統(tǒng)稱為編碼。

3. 字符編碼的發(fā)展史
第一階段:起源,ASCII
計(jì)算機(jī)是美國(guó)人發(fā)明的,人家用的是美式英語,字符比較少,所以一開始就設(shè)計(jì)了一個(gè)不大的二維表,128個(gè)字符,取名叫ASCII(American Standard Code for Information Interchange)。但是7位編碼的字符集只能支持128個(gè)字符,為了表示更多的歐洲常用字符對(duì)ASCII進(jìn)行了擴(kuò)展,ASCII擴(kuò)展字符集使用8位(bits)表示一個(gè)字符,共256字符。即其最多只能用 8 位來表示(一個(gè)字節(jié))。

第二階段:GBK
當(dāng)計(jì)算機(jī)傳到了亞洲,尤其是東亞,國(guó)際標(biāo)準(zhǔn)被秒殺了,路邊小孩隨便說句話,256個(gè)碼位就不夠用了。于是,中國(guó)定制了GBK。用2個(gè)字節(jié)代表一個(gè)字符(漢字)。其他國(guó)家也紛紛定制了自己的編碼,例如:

日本把日文編到Shift_JIS里,韓國(guó)把韓文編到Euc-kr里。

第三階段:unicode  
當(dāng)互聯(lián)網(wǎng)席卷了全球,地域限制被打破了,不同國(guó)家和地區(qū)的計(jì)算機(jī)在交換數(shù)據(jù)的過程中,就會(huì)出現(xiàn)亂碼的問題,跟語言上的地理隔離差不多。為了解決這個(gè)問題,一個(gè)偉大的創(chuàng)想產(chǎn)生了——Unicode(萬國(guó)碼)。Unicode編碼系統(tǒng)為表達(dá)任意語言的任意字符而設(shè)計(jì)?! ?/div>

規(guī)定所有的字符和符號(hào)最少由 16 位來表示(2個(gè)字節(jié)),即:2 **16 = 65536,注:此處說的的是至少2個(gè)字節(jié)(16位),可能更多。

第四階段:UTF-8
unicode的編碼方式雖然包容萬國(guó),但是對(duì)于英文等字符就會(huì)浪費(fèi)太多存儲(chǔ)空間。于是出現(xiàn)了UTF-8,是對(duì)Unicode編碼的壓縮和優(yōu)化,遵循能用最少的表示就用最少的表示,他不再使用最少使用2個(gè)字節(jié),而是將所有的字符和符號(hào)進(jìn)行分類:ascii碼中的內(nèi)容用1個(gè)字節(jié)保存、歐洲的字符用2個(gè)字節(jié)保存,東亞的字符用3個(gè)字節(jié)保存。

補(bǔ)充:

unicode:包容萬國(guó),優(yōu)點(diǎn)是字符->數(shù)字的轉(zhuǎn)換速度快,缺點(diǎn)是占用空間大

utf-8:精準(zhǔn),對(duì)不同的字符用不同的長(zhǎng)度表示,優(yōu)點(diǎn)是節(jié)省空間,缺點(diǎn)是:字符->數(shù)字的轉(zhuǎn)換速度慢,因?yàn)槊看味夹枰?jì)算出字符需要多長(zhǎng)的Bytes才能夠準(zhǔn)確表示
內(nèi)存中使用的編碼是unicode,用空間換時(shí)間,為了快
因?yàn)槌绦蚨夹枰虞d到內(nèi)存才能運(yùn)行,因而內(nèi)存應(yīng)該是盡可能的保證快。

硬盤中或者網(wǎng)絡(luò)傳輸用utf-8,網(wǎng)絡(luò)I/O延遲或磁盤I/O延遲要遠(yuǎn)大與utf-8的轉(zhuǎn)換延遲,而且I/O應(yīng)該是盡可能地節(jié)省帶寬,保證數(shù)據(jù)傳輸?shù)姆€(wěn)定性。因?yàn)閿?shù)據(jù)的傳輸,追求的是穩(wěn)定,高效,數(shù)據(jù)量越小數(shù)據(jù)傳輸就越靠譜,于是都轉(zhuǎn)成utf-8格式的,而不是unicode。

如下圖:



4. 字符編碼的使用
1) 文本編輯器存取文件的原理(nodepad ,pycharm,word)

  打開編輯器就打開了啟動(dòng)了一個(gè)進(jìn)程,是在內(nèi)存中的,所以在編輯器編寫的內(nèi)容也都是存放與內(nèi)存中的,斷電后數(shù)據(jù)丟失。因而需要保存到硬盤上,點(diǎn)擊保存按鈕,就從內(nèi)存中把數(shù)據(jù)刷到了硬盤上。在這一點(diǎn)上,我們編寫一個(gè)py文件(沒有執(zhí)行),跟編寫其他文件沒有任何區(qū)別,都只是在編寫一堆字符而已。

  無論是何種編輯器,要防止文件出現(xiàn)亂碼,核心法則就是,文件以什么編碼保存的,就以什么編碼方式打開。

2) python解釋器執(zhí)行py文件的原理 (python test.py)

第一階段:python解釋器啟動(dòng),此時(shí)就相當(dāng)于啟動(dòng)了一個(gè)文本編輯器
第二階段:python解釋器相當(dāng)于文本編輯器,去打開test.py文件,從硬盤上將test.py的文件內(nèi)容讀入到內(nèi)存中
第三階段:python解釋器解釋執(zhí)行剛剛加載到內(nèi)存中test.py的代碼
  

補(bǔ)充:

所以,在寫代碼時(shí),為了不出現(xiàn)亂碼,推薦使用UTF-8,會(huì)加入

# -*- coding: utf-8 -*-

#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
print "你好,世界"
python解釋器會(huì)讀取test.py的第二行內(nèi)容,# -- coding: utf-8 --,來決定以什么編碼格式來讀入內(nèi)存,這一行就是來設(shè)定python解釋器這個(gè)軟件的編碼使用的編碼格式這個(gè)編碼。

如果不在python文件指定頭信息#--coding:utf-8--,那就使用默認(rèn)的python2中默認(rèn)使用ascii,python3中默認(rèn)使用utf-8

總結(jié):

1)python解釋器是解釋執(zhí)行文件內(nèi)容的,因而python解釋器具備讀py文件的功能,這一點(diǎn)與文本編輯器一樣

2)與文本編輯器不一樣的地方在于,python解釋器不僅可以讀文件內(nèi)容,還可以執(zhí)行文件內(nèi)容

5. python2和python3的一些不同
1) python2中默認(rèn)使用ascii,python3中默認(rèn)使用utf-8

2) Python2中,str就是編碼后的結(jié)果bytes,str=bytes,所以s只能decode。

3) python3中的字符串與python2中的u'字符串',都是unicode,只能encode,所以無論如何打印都不會(huì)亂碼,因?yàn)榭梢岳斫鉃閺膬?nèi)存打印到內(nèi)存,即內(nèi)存->內(nèi)存,unicode->unicode

4) python3中,str是unicode,當(dāng)程序執(zhí)行時(shí),無需加u,str也會(huì)被以u(píng)nicode形式保存新的內(nèi)存空間中,str可以直接encode成任意編碼格式,s.encode('utf-8'),s.encode('gbk')

#unicode(str)-----encode---->utf-8(bytes)
#utf-8(bytes)-----decode---->unicode
5)在windows終端編碼為gbk,linux是UTF-8.
 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多