一、字元編碼演變史
- 二進制(0 1)
""" 算機中的所有資料,不論是文字、圖檔、視訊、還是音頻檔案,本質上最終都是按照類似 01010101 的二進制存儲的,再說簡單點,計算機隻懂二進制數字 """
- ASCII(隻能存因為或者拉丁字元,其中一個字元占一個子節,一個位元組8位)
""" 256種不同狀态,每種狀态就唯一對應一個字元,比如A--->00010001 """
- gb2312()
""" 計算機漂洋過海來到中國後,問題來了,計算機不認識中文,當然也沒法顯示中文;而且一個位元組所有狀态都被占滿了,我黨很棒,自力更生,自己重寫一張表,直接生猛地将擴充的第八位對應拉丁文全部删掉,規定一個小于127的字元的意義與原來相同,但兩個大于127的字元連在一起時,就表示一個漢字,前面的一個位元組(他稱之為高位元組)從0xA1用到0xF7,後面一個位元組 (低位元組)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了;這種漢字方案叫做 “GB2312”。GB2312 是對 ASCII 的中文擴充。 """
- gbk(支援20000多個漢字) 和 gb18030(支援27000多中文) 編碼
- unicode
"""很多其它國家都搞出自己的編碼标準,彼此間卻互相不支援。這就帶來了很多問題。于是,國際标誰化組織為了統一編碼:提出了标準編碼準 則:UNICODE 。 UNICODE是用兩個位元組來表示為一個字元,它總共可以組合出65535不同的字元,這足以覆寫世界上所有符号(包括甲骨文) """
- utf-8
""" unicode都一統天下了,為什麼還要有一個utf8的編碼呢? 大家想,對于英文世界的人們來講,一個位元組完全夠了,比如要存儲A,本來00010001就可以了,現在吃上了unicode的大鍋飯, 得用兩個位元組:00000000 00010001才行,浪費太嚴重! 基于此,美利堅的科學家們提出了天才的想法:utf8. UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,它可以使用1~4個位元組表示一個符号,根據 不同的符号而變化位元組長度,當字元在ASCII碼的範圍時,就用一個位元組表示,是以是相容ASCII編碼的。 這樣顯著的好處是,雖然在我們記憶體中的資料都是unicode,但當資料要儲存到磁盤或者用于網絡傳輸時,直接使用unicode就遠不如utf8省空間啦! 這也是為什麼utf8是我們的推薦編碼方式。 Unicode與utf8的關系: 一言以蔽之:Unicode是記憶體編碼表示方案(是規範),而UTF是如何儲存和傳輸Unicode的方案(是實作)這也是UTF與Unicode的差別。 """
二、轉碼
1、python2.x 轉碼和解碼
#-*-coding:utf-8-*-
import sys
print(sys.getdefaultencoding()) #擷取預設編碼格式
msg = "我愛北京天安門"
msg_gb2312 = msg.decode("utf-8").encode("gb2312")
gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")
print(msg)
print(msg_gb2312)
print(gb2312_to_gbk)
2、python3.x 轉碼和解碼
- 在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string
import sys
print(sys.getdefaultencoding())
msg = "我愛北京天安門"
msg_gb2312 = msg.encode("gb2312") #預設就是unicode,不用再decode
gb2312_to_unicode = msg_gb2312.decode("gb2312")
gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
print(msg)
print(msg_gb2312)
print(gb2312_to_unicode)
print(gb2312_to_utf8)
作者:多測師進階講師_鄭sir
微信:ZhengYing8887
出處:https://www.cnblogs.com/ZhengYing0813/
備注:本文版權歸作者所有,歡迎轉載和添加作者微信探讨技術,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。