1、字元與位元組有什麼區別

(一)位元組

位元組(Byte)是一種計量單位,表示數據量多少,主要用於存儲網路傳輸。1 byte=8 bit (KB,M)

(二)字元

字元是指計算機中使用的文字和符號,比如1、2、3、A、B、C、~!·#¥%……

(三)「位元組」與「字元」

它們完全不是一個位面的概念不同編碼裏,字元和位元組的對應關係不同:

ASCII碼中,一個英文字母(不分大小寫)佔一個位元組的空間,一個中文漢字佔兩個位元組的空間。一個二進位數字序列,在計算機中作為一個數字單元,一般為8位二進位數,換算為十進位。最小值0,最大值255。

UTF-8編碼中,一個英文字元=一個位元組,一個中文(含繁體)=三個位元組。

Unicode編碼中,一個英文等於=兩位元組,一個中文(含繁體)=兩個位元組。

符號:英文標點佔一個位元組,中文標點佔兩個位元組。舉例:英文句號「.」佔1個位元組的大小,中文句號「。」佔2個位元組的大小。

x表示無的意思,utf8英文省空間

字元(不同方式編碼給人看),位元組(計算機看)

ASCII:最早只有127個字元被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母A的編碼是65

我們平時說的 ASCII 其實有兩個含義,一個是 ASCII 字符集,另一個是 ASCII 編碼。

ASCII 字符集只是定義了字元與字元碼(character code,也稱 code point 代碼點)的對應關係。也就是說這一層面只是規定了字元A用 65 表示,至於
這個 65 在內存或硬碟中怎麼表示,它不管,那是 ASCII 編碼做的事。

ASCII 編碼規定了用 7 個二進位位保存 ASCII 字元碼(定義字符集的存儲形式),剩下 1 位為 Parity bit,也稱為校驗位,用以檢查數據的正確性。

Unicode把所有語言都統一到一套編碼裏,不會有亂碼問題。(所有文字用這個)。

UTF-8:本著節約的精神,把Unicode編碼轉化為「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間。

>>> 中.encode(ascll)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: unknown encoding: ascll
>>> 中.encode(utf-8) #編碼encode給計算機看
bxe4xb8xad
>>> bxe4xb8xad
bxe4xb8xad
>>> bxe4xb8xad.decode(utf-8) #解碼decode給人看

字元、代碼點、二進位位元組關係圖

Character 字元。即我們看到的單個符號,像「A」、「啊」等
Code point 代碼點。一個無符號數字,通常用16進位表示。代碼點與字元的一一對應關係稱為字符集(Character Set),這種對應關係肯定不止一種,也
就導致了不同字符集的出現,像 ASCII、ISO-8859-1、GB2312、GBK、Unicode 等。
Bytes 二進位位元組。其含義為代碼點在內存或磁碟中的表示形式。代碼點與二進位位元組的一一對應關係稱為編碼(Encoding),當然這種對應關係也不是唯
一的,所以編碼也有很多種,像 ASCII、ISO-8859-1、ENC-CN、GBK、UTF-8等。

在計算機內存中,統一使用Unicode編碼,當需要保存到硬碟或者需要傳輸的時候,就轉換為UTF-8編碼

用記事本編輯的時候,從文件讀取的UTF-8字元被轉換為Unicode字元到內存裏,編輯完成後,保存的時候再把Unicode轉換為UTF-8保存到文件。

記事本存在硬碟上面

瀏覽網頁的時候,伺服器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器:

也是存在硬碟上面

Python 3版本中,字元串以Unicode編碼

>>> print(包含中文的str)
包含中文的str

Python的字元串類型是str,在內存中以Unicode表示,一個字元對應若干個位元組。如果要在網路上傳輸,或者保存到磁碟上,就需要把str變為以位元組為單位的bytes

Python對bytes類型的數據用帶b前綴的單引號或雙引號表示

x = bABC

要注意區分ABCbABC,前者是str,後者雖然內容顯示得和前者一樣,但bytes的每個字元都只佔用一個位元組

以Unicode表示的str通過encode()方法可以編碼為指定的bytes,例如:

>>> ABC.encode(ascii) #utf8佔3位元組
bABC #還是3位元組
>>> 中文.encode(utf-8)
bxe4xb8xadxe6x96x87
>>> 中文.encode(ascii) #無
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: ascii codec cant encode characters in position 0-1: ordinal not in range(128)

如果bytes中只有一小部分無效的位元組,可以傳入errors=ignore忽略錯誤的位元組:

>>> bxe4xb8xadxff.decode(utf-8, errors=ignore)

由於Python源代碼也是一個文本文件,所以,當你的源代碼中包含中文的時候,在保存源代碼時,就需要務必指定保存為UTF-8編碼。當Python解釋器讀取源代碼時,為了讓它按UTF-8編碼讀取,我們通常在文件開頭寫上這兩行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注釋是為了告訴Linux/OS X系統,這是一個Python可執行程序,Windows系統會忽略這個注釋;

第二行注釋是為了告訴Python解釋器,按照UTF-8編碼讀取源代碼,否則,你在源代碼中寫的中文輸出可能會有亂碼。

格式化

format()

>>> Hello, {0}, 成績提升了 {1:.1f}%.format(小明, 17.125)
Hello, 小明, 成績提升了 17.1%

strbytes互相轉換時,需要指定編碼。最常用的編碼是UTF-8。Python當然也支持其他編碼方式,比如把Unicode編碼成GB2312

>>> 中文.encode(gb2312)
bxd6xd0xcexc4

但這種方式純屬自找麻煩,如果沒有特殊業務要求,請牢記僅使用UTF-8編碼。

推薦閱讀:

相關文章