1. 程式人生 > >python之bytes和string

python之bytes和string

1、bytes主要是給在計算機看的,string主要是給人看的

2、中間有個橋樑就是編碼規則,現在大趨勢是utf8

3、bytes物件是二進位制,很容易轉換成16進位制,例如\x64

4、string就是我們看到的內容,例如'abc'

5、string經過編碼encode,轉化成二進位制物件,給計算機識別

6、bytes經過反編碼decode,轉化成string,讓我們看,但是注意反編碼的編碼規則是有範圍,\xc8就不是utf8識別的範圍

#!/usr/bin/env python # -*- coding: utf8 -*- # __Author: "Skiler Hao" # date: 2017/4/9 15:26
import hashlib #位元組物件b
b = b"example"
#字串物件s
s = "example"
print(b) print("example") #將字串轉換為位元組物件
b2 = bytes(s,encoding='utf8')  #必須制定編碼格式 # print(b2) #字串encode將獲得一個bytes物件
b3 = str.encode(s) b4 = s.encode() print(b3) print(type(b3)) print(b4) #將位元組物件decode將獲得一個str物件
s2 = bytes.decode(b) s3 = b.decode() print(s2) print(s3)

以下來自另外一篇

在Python中,bytes和string是不同的東西。由一系列不可改變的Unicode字元組成的叫string。而一系列不可改變的介於0-255之間的數字被稱為bytes物件。

unicode是一種編碼標準,具體的實現標準可能是utf-8,utf-16,gbk ……

python 在內部使用兩個位元組來儲存一個unicode,使用unicode物件而不是str的好處,就是unicode方便於跨平臺。

Unicode

Unicode是計算機可以支援這個星球上的多種語言的祕密武器,在Unicode之前,用的都是ASCII,ASCII嗎非常簡單,每個英文字元都用7位二進位制數的方式儲存在計算機內,其範圍是32到126.它的實現原理這裡也不說了。
但是ASCII碼只能表示95個可列印的字元,後來把ASCII擴充套件到了8位,這樣就能表示223個字元了,雖然這個來表示歐美字母語言已經足夠了,但是對於像中文等語系來說就太少了。於是Unicode碼誕生了。

Unicode通過使用一個或者多個位元組來表示一個字元,這樣就突破了ASCII的限制,這樣,Unicode可以表示超過90000個字元了。

Py3

python3的str等於python2的unicode,也就是在python3處理時,原始碼相當於全部都是u”
而且python3的str不提供decode(因為概念上unicode就沒有帶encoding)

Python 3最重要的新特性大概要算是對文字和二進位制資料作了更為清晰的區分。文字總是Unicode,由str型別表示,二進位制資料則由bytes型別表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得兩者的區分特別清晰。你不能拼接字串和位元組包,也無法在位元組包裡搜尋字串(反之亦然),也不能將字串傳入引數為位元組包的函式(反之亦然)。

常見編碼

  • GB2312編碼:適用於漢字處理、漢字通訊等系統之間的資訊交換

  • GBK編碼:是漢字編碼標準之一,是在 GB2312-80 標準基礎上的內碼擴充套件規範,使用了雙位元組編碼

  • ASCII編碼:是對英語字元和二進位制之間的關係做的統一規定

  • Unicode編碼:這是一種世界上所有字元的編碼。當然了它沒有規定的儲存方式。

  • UTF-8編碼:是 Unicode Transformation Format - 8 bit 的縮寫, UTF-8 是 Unicode 的一種實現方式。它是可變長的編碼方式,可以使用 1~4 個位元組表示一個字元,可根據不同的符號而變化位元組長度。

  • decode與encode

    Python內部的字串一般都是 Unicode編碼。程式碼中字串的預設編碼與程式碼檔案本身的編碼是一致的。所以要做一些編碼轉換通常是要以Unicode作為中間編碼進行轉換的,即先將其他編碼的字串解碼(decode)成 Unicode,再從 Unicode編碼(encode)成另一種編碼。

  • decode的作用是將其他編碼的字串轉換成Unicode編碼,name.decode(“GB2312”),表示將GB2312編碼的字串name轉換成Unicode編碼`,也就是將將原來name解碼成unicode,字面上理解為將其他字元編碼成unicode
  • encode的作用是將Unicode編碼轉換成其他編碼的字串,name.encode(”GB2312“),表示將GB2312編碼的字串name轉換成GB2312編碼
  • Tips:對 Unicode 進行編碼和對 str 進行編碼都是錯誤的。

    所以在進行編碼轉換的時候必須先知道 name 是那種編碼,然後 decode 成 Unicode 編碼,最後在 encode 成需要編碼的編碼。當然了,如果 name 已經就是 Unicode 編碼了,那麼就不需要進行 decode 進行解碼轉換了,直接用 encode 就可以編碼成你所需要的編碼。

  • Tips:對 Unicode 進行編碼和對 str 進行編碼都是錯誤的。