最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python字符集和字符編碼詳情

 更新時間:2022年05月11日 17:26:42   作者:??編程學(xué)習(xí)網(wǎng)????  
這篇文章主要介紹了Python字符集和字符編碼詳情,Python中的字符串是通過unicode來表示的,在底層對應(yīng)的結(jié)構(gòu)體是PyUnicodeObject,但是具體為什么呢?帶著疑問一起學(xué)習(xí)下面文章內(nèi)容吧

前言

這一次我們分析一下Python的字符串,首先字符串是一個變長對象,因為不同長度的字符串所占的內(nèi)存是不一樣的;但同時字符串又是一個不可變對象,因為一旦創(chuàng)建就不可以再修改了。

而Python中的字符串是通過unicode來表示的,在底層對應(yīng)的結(jié)構(gòu)體是PyUnicodeObject。不過話說回來,為什么需要unicode呢?

首先計算機存儲的基本單位是字節(jié),由8個比特位組成,由于英文字母算上大小寫只有52個,再加上若干字符,數(shù)量不會超過256個,因此一個字節(jié)完全可以表示。但是隨著計算機的普及,越來越多的非英文字符出現(xiàn),導(dǎo)致一個字節(jié)已經(jīng)無法表示了。所以只能曲線救國,對于一個字節(jié)無法表示的字符,使用多個字節(jié)表示

但是這樣會出現(xiàn)兩個問題:

  • 因為每個國家都有自己的字符編碼,所以不支持多國語言,例如中文的編碼不可以包含日文,否則就會造成亂碼;
  • 沒有統(tǒng)一標(biāo)準(zhǔn),例如中文有GB2312、GBK、GB18030等多個標(biāo)準(zhǔn);

到這里我們先不繼續(xù)往下深入,我們先來理清楚一些概念。

字符集和字符編碼

估計有很多小伙伴搞不清這兩者的區(qū)別,我們先來解釋一下所謂的字符集和字符編碼是怎么一回事?

字符集:系統(tǒng)支持的所有字符組成的集合,像ASCII、GB2312、Big5、unicode都屬于字符集。只不過不同的字符集所能容納的字符個數(shù)不同,比如ASCII字符集中不包含中文,unicode則可以容納世界上的所有字符;

字符編碼:負(fù)責(zé)將每個字符轉(zhuǎn)換成一個或多個計算機可以接受的具體數(shù)字,該數(shù)字可以理解為編號,因此字符編碼維護了字符和編號之間的對應(yīng)關(guān)系。而編碼也分為多種,比如ascii、gbk、utf-8等等,字符編碼不同,那么字符轉(zhuǎn)換之后的編號也不同,當(dāng)然能轉(zhuǎn)化的字符種類也不同。比如ASCII這種字符編碼,它就只能轉(zhuǎn)換ASCII字符。

當(dāng)然,ASCII比較特殊,它既是字符集、也是字符編碼。并且不管采用什么編碼,ASCII字符對應(yīng)的編號永遠是相同的。

將字符串中的每一個字符轉(zhuǎn)成對應(yīng)的編號,那么得到的就是字節(jié)序列(bytes對象),因為計算機存儲和網(wǎng)絡(luò)通訊的基本單位都是字節(jié),所以字符串必須以字節(jié)序列的形式進行存儲或傳輸。

因此字符串和字節(jié)序列在某種程度上是很相似的,字符串按照指定的編碼進行encode即可得到字節(jié)序列,也就是將每個字符都轉(zhuǎn)成對應(yīng)的編號;字節(jié)序列按照相同的編碼decode即可得到字符串,也就是根據(jù)編號找到對應(yīng)的字符。

比如我們寫了一段文本,然后在存儲的時候必須先進行編碼,也就是將每一個字符都轉(zhuǎn)成一個或多個系統(tǒng)可以接受的數(shù)字、即對應(yīng)的編號之后,才可以進行存儲。

s = "你好"
# 編碼之后就是一串?dāng)?shù)字
print(s.encode("gbk"))  # b'\xc4\xe3\xba\xc3'

假設(shè)文本中只有你好二字,在存儲的時候采用gbk進行編碼,那么在讀取的時候也必須使用gbk進行解碼,否則的話就會無法解析而報錯。因為字符編碼不同,字符對應(yīng)的編號也不同。

再比如每個國家都有自己的字符編碼,你在日本的一臺計算機上寫好的文件拿到中國的計算機上打開,很有可能出現(xiàn)亂碼。因為字符編碼不同,字符和編號之間的對應(yīng)關(guān)系也不同,采用不同的字符編碼進行解析肯定會出問題。

但我們說,對于ASCII字符來說,由于不管采用哪一種編碼,它們得到的編號都是固定的。所以編碼對于ASCII字符來說,沒有任何影響。

s = "abc"
print(s.encode("gbk"))  # b'abc'
print(s.encode("gbk").decode("utf-8"))  # abc

# 但如果是非ASCII字符,就不行了
try:
    s = "你好"
    s.encode("gbk").decode("utf-8")
except UnicodeError as e:
    # 報錯了,無法解析
    print(e)  
    # 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte

這里我們再回憶一下bytes對象,我們創(chuàng)建的時候可以采用字面量的方式,比如 b"abc",但是 b"憨"卻不可以。原因就是憨這個字符不是ASCII字符,那么采用不同的字符編碼,其對應(yīng)的編號是不同的,而這種方式Python又不知道我們使用哪一種編碼,所以不允許這么做,而是需要通過"憨".encode的方式手動指定字符編碼。

但是對于 ASCII 字符而言,不管采用哪一種字符編碼,得到的編號都是一樣的, 所以Python針對ASCII字符則允許這種做法,比如b"abc"。并且我們看到,對于漢字來說,在編碼之后會對應(yīng)多個編號,而每個編號占1字節(jié),因此不同的字符所占的大小可能不同。

小結(jié)

以上就是字符集和字符編碼,字符集就是字符組成的集合,不同字符集所能容納的字符數(shù)量是有限的。字符編碼是將字符轉(zhuǎn)成對應(yīng)的編號,比如將一個字符串中的所有字符都轉(zhuǎn)成對應(yīng)的編號之后,就得到了字節(jié)序列。

當(dāng)然和字符集一樣,字符編碼能轉(zhuǎn)換的字符種類也是有限的,像漢字我們可以使用 gbk 編碼、utf-8 編碼,但是不能使用 ascii 編碼。

到此這篇關(guān)于Python字符集和字符編碼詳情的文章就介紹到這了,更多相關(guān)Python字符編碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python?requests.post請求404問題及解決方法

    python?requests.post請求404問題及解決方法

    這篇文章主要介紹了python?requests.post請求404問題,這里需要根據(jù)自己實際情況來分析當(dāng)前接口接收數(shù)據(jù)時使用的是什么格式,但目前一般的網(wǎng)站都開始采用application/jsond的數(shù)據(jù)格式,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 深入學(xué)習(xí)python多線程與GIL

    深入學(xué)習(xí)python多線程與GIL

    這篇文章主要介紹了深入學(xué)習(xí)python多線程與GIL,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • Python結(jié)合requests和Cheerio處理網(wǎng)頁內(nèi)容的操作步驟

    Python結(jié)合requests和Cheerio處理網(wǎng)頁內(nèi)容的操作步驟

    Python因其簡潔明了的語法和強大的庫支持,成為了編寫爬蟲程序的首選語言之一,requests庫是Python中用于發(fā)送HTTP請求的第三方庫,而Cheerio庫則是一個用于解析HTML和XML文檔的庫,本文給大家介紹了Python結(jié)合requests和Cheerio處理網(wǎng)頁內(nèi)容的操作步驟
    2025-01-01
  • Python使用itchat模塊實現(xiàn)群聊轉(zhuǎn)發(fā),自動回復(fù)功能示例

    Python使用itchat模塊實現(xiàn)群聊轉(zhuǎn)發(fā),自動回復(fù)功能示例

    這篇文章主要介紹了Python使用itchat模塊實現(xiàn)群聊轉(zhuǎn)發(fā),自動回復(fù)功能,結(jié)合實例形式分析了Python基于itchat模塊針對微信信息的發(fā)送、回復(fù)等相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • python中去空格函數(shù)的用法

    python中去空格函數(shù)的用法

    這篇文章主要介紹了python中去空格函數(shù)的用法,很實用的技巧,需要的朋友可以參考下
    2014-08-08
  • 淺談一下Python中的with用法

    淺談一下Python中的with用法

    這篇文章主要介紹了淺談一下Python中的with用法,有一些任務(wù),可能事先需要設(shè)置,事后做清理工作。對于這種場景,Python的with語句提供了一種非常方便的處理方式,需要的朋友可以參考下
    2023-04-04
  • Python保存數(shù)據(jù)到文件的實現(xiàn)方式

    Python保存數(shù)據(jù)到文件的實現(xiàn)方式

    這篇文章主要介紹了Python保存數(shù)據(jù)到文件的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • python-docx讀取模板文檔并填充數(shù)據(jù)

    python-docx讀取模板文檔并填充數(shù)據(jù)

    python-docx?是開源的一個?Python?庫,用于讀取、創(chuàng)建和更新Microsoft?Word?2007+(.docx)文件,下面我們就來看看如何利用python-docx讀取模板文檔并填充數(shù)據(jù)吧
    2024-11-11
  • 設(shè)置jupyter中DataFrame的顯示限制方式

    設(shè)置jupyter中DataFrame的顯示限制方式

    這篇文章主要介紹了設(shè)置jupyter中DataFrame的顯示限制方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來
    2020-04-04
  • Python 序列的方法總結(jié)

    Python 序列的方法總結(jié)

    這篇文章主要介紹了Python 序列的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評論

林州市| 张北县| 平塘县| 松原市| 靖宇县| 寿阳县| 浦城县| 分宜县| 宝清县| 吐鲁番市| 芜湖县| 扬州市| 大冶市| 祁阳县| 林口县| 屏山县| 英山县| 张家川| 辉南县| 虎林市| 鄱阳县| 渝北区| 塔城市| 榆林市| 古交市| 吉隆县| 阿勒泰市| 朝阳市| 南木林县| 红桥区| 贺州市| 阆中市| 北川| 云林县| 巧家县| 太和县| 镶黄旗| 江华| 吉安市| 肃宁县| 北流市|