編碼與解碼 python 經驗

2021-07-26 05:32:09 字數 2846 閱讀 4715

位元(bit),也稱二進位制位,指二進位制中的一位,是計算機資訊的最小單位。bit是binary digit(二進位制數字)的縮寫,還可被縮寫為b。

位元組(港澳台稱位元組,byte),乙個位元組代表8個位元,也被縮寫為b,在工業標準、網路、電信技術中也被成為八位組(octet)。

字面量,可以理解為給人看的內容,比如在python**中有:

str_demo

str_demo = "abc"

str_demo_1 = "中國"

abc 和 中國 就是字面量,而字面量的值即預設工作字符集的編碼。

編碼即轉換,字元編碼(character encoding),是把字符集中的字元編碼為指定集合中的某一物件(位元、自然數序列、電脈衝),以便文字在計算機中儲存和通過網路傳遞。比如:將拉丁字母表編碼成ascii。而ascii將字母、數字和其它符號編號,並用7位元的二進位制來表示這個整數,通常會額外使用乙個擴充的位元,比便於以乙個位元組的方式儲存。

內碼 & ascii & ansi:

字元內碼(character code)指的是用來代表(編碼)字元(字面量)的計算機內碼,程式在輸入和儲存文件時都要使用內碼,內碼分為:單位元組內碼,可以支援256個字元編碼,雙子節內碼可以支援65000個字元編碼,前者為ascii,後者對應ansi。

ascii(發音:/ˈæski/)

american standard code for information interchange,美國資訊交換標準**,是基於拉丁字母的一套編碼系統。它主要用於現實現代英語,至今為止(2023年)共定義了128個字元;其中95個可顯示字元(空格也算)其它33個字元是圖案或多已廢棄的控制符。

而我們博大精深的中文(還有很多其它亞洲文字),文字n多,所以使用了雙位元組的方式,gb2312(簡體中文編碼的一種),實際上是ansi的乙個**頁(936),使用不同**頁的內碼無法在其它**頁正常顯示,中英混排字數統計等問題僅僅使用擴充套件ascii是比較痛苦的。

那麼能不能用一種編碼集應對所用文字呢?於是乎偉大的unicode誕生了

unicode:

也被稱為國際碼,統一碼,它對大部分文字進行了整理編碼,它伴隨著通用字符集(universal character set, ucs)的標準而發展,到2023年6月21日公布的9.0.0版本,已經收入了10萬+個字元。

然而這個世界不是理想的,不可能一夜之間所有系統都使用unicode來處理字元,所以在unicode誕生之日就面臨乙個嚴峻的考驗:相容!

utf-8:

所有字元的unicode編碼是確定的,但是在傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對unicode編碼的實現方式有所不同。unicode的實現方式稱為unicode轉換格式(unicode transformation format)

utf-8可以說是讓unicode能夠真正落地實施的方案,它以8位為單元對unicode進行變長編碼。它將基本7位ascii字元仍用7位編碼表示,占用乙個位元組(首位補0)。而遇到與其他unicode字元混合的情況,將按一定演算法轉換,每個字元使用1-3個位元組編碼,並利用首位為0或1進行識別。

從unicode到utf-8的編碼轉換方式如下:

unicode編碼(16進製制)     utf-8 位元組流(二進位制)

0000 - 007f         0******x

0080 - 07ff         110***xx 10******

0800 - ffff         1110***x 10****** 10******

此外unicode的實現方式還有utf-7、utf-16、utf-32、punycode、cesu-8、scsu、gb18030等,這些實現方式有些僅在一定的國家和地區使用,有些則屬於未來的規劃方式。

目前通用的實現方式是utf-16小端序(le, little endian)、utf-16大端序(be, big endian)和utf-8。

位元組序和bom

雙位元組編碼乙個字元的時候,就會遇到位元組序的問題,比如:「中」的unicode編碼是4e 2d,大數在前就是大端。

bom(byte order mark)

主要目的是表明編碼位元組序,實現上是乙個有點小聰明的想法:

在ucs編碼中有乙個叫做」zero width no-break space」的字元,它的編碼是feff。而fffe在ucs中是不存在的字元,所以不應該出現在實際傳輸中。ucs規範建議我們在傳輸位元組流前,先傳輸字元」zero width no-break space」。

這樣如果接收者收到feff,就表明這個位元組流是big-endian的;如果收到fffe,就表明這個位元組流是little-endian的。因此字元」zero width no-break space」又被稱作bom。

utf-8不需要bom來表明位元組順序,但可以用bom來表明編碼方式。字元」zero width no-break space」的utf-8編碼是ef bb

1、unicode做為中間碼傳輸,顯示的時候再根據需要轉碼

2、python中有個包叫chardet,它是用來猜測編碼的,注意是猜測

3、如果乙個字串的字面量儲存成了編碼,想要變回真正的字面量時,通用的做法需要用正則搞一下,然而往往情況比較簡單,只需要decode(string_escape),比如下面這個字串的內容:

>>> abc = "\\xe4\\xb8\\xadabc\\xe5\\x9b\\xbd123"

>>> print abc

\xe4\xb8\xadabc\xe5\x9b\xbd123

>>> print abc.decode('string_escape')

中abc國123

Python 編碼與解碼

字串型別是對人類友好的符號,但計算機只認識一種符號,那就是二進位制 binary 數,或者說是數字。為了用計算機可以理解的數字描述人類使用的字元,我們需要一張數字與字元對應的表。我們都知道在計算機中 1 byte 8bits,可以儲存 0 255共256個值,也就是說 1byte最多可以表示 256...

python的編碼與解碼

1.特殊情況 xe5 xae x9d xe9 x python2控制台bai輸出會有這種情況,包括以下list裡面的漢字雖du然是utf8格式的但仍然zhi不可見中文。只需要包要檢視的list轉為str並decode string escape 例子為 li 33,39 寶馬 36,39 馬 pri...

python的編碼與解碼

python中的字元型別 python中的字元型別分兩種 1.str型別 ascii表中的字元,佔乙個位元組,所以也叫位元組字元。字面量用雙引號表示。s ok,u u 我,u1 u 我 u2 u 愛python print s s print u1 u1 print u2 u2 解析器通常把unic...