天天看點

python(字元編碼與轉碼)

一、字元編碼演變史

  • 二進制(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 轉碼和解碼

python(字元編碼與轉碼)
#-*-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/

備注:本文版權歸作者所有,歡迎轉載和添加作者微信探讨技術,但未經作者同意必須在文章頁面給出原文連結,否則保留追究法律責任的權利。

繼續閱讀