1. 程式人生 > >Python中的str與bytes

Python中的str與bytes

在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編碼

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

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

字串可以編碼成位元組包,而位元組包可以解碼成字串。

>>>'€20'.encode('utf-8')
b'\xe2\x82\xac20'
>>> b'\xe2\x82\xac20'.decode('utf-8')
'€20'

簡單的win剪下板操作

def getText():
    w.OpenClipboard()
    d = w.GetClipboardData(win32con.CF_TEXT)
    w.CloseClipboard()
    return d.decode('utf-8','ignore')

def setText(aString):
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_TEXT,aString)
    w.CloseClipboard()

上面是定義的兩個函式,分別是對剪下板進行讀、寫操作。遺憾的是,由於剪下板中複雜的編碼問題,在win平臺下很難有效的對非英文字元進行操作。

相關推薦

python strbytes的轉換

odin 拋出異常 str1 string 異常 非法字符 ignore bytes nor # bytes轉字符串方式一 b=b‘\xe9\x80\x86\xe7\x81\xab‘ string=str(b,‘utf-8‘) print(string) # bytes轉

pythonstrlist互轉

1、list轉str 假設有一個名為test_list的list,轉換後的str名為test_str 則轉換方法: test_str = "".join(test_list) 需要注意的是該方法需要list中的元素為字元型,若是整型,則需要先轉換為字元型後再轉為str型別。

json.decoder.JSONDecodeError: Invalid control character at: line 1 column 3,pythonstrjson型別轉換報錯如何解

使用json轉: json資料保密,再此不展示。 # 判斷型別 print(type(str_json)) json_dump = json.loads(str_json) 報錯如下: json.decoder.JSONDecodeError: Invalid control cha

pythonstrlist互換,txt檔案的讀取,字串變成列表操作,另存為TXT時從列表變成字串

file = open ("wider_face_train_bbx_gt.txt") for line in lines: print(type(line)) #<type 'str'> #78 221 7 8 2 0 0 0 0

Pythonstrbytes之間的轉換的三種方法

# bytes object b = b"example" # str object s = "example" # str to bytes sb = bytes(s, encoding = "utf8") # bytes to str bs = str(b, encod

Pythonstrbytes

在Python中,bytes和string是不同的東西。由一系列不可改變的Unicode字元組成的叫string。而一系列不可改變的介於0-255之間的數字被稱為bytes物件。 unicode是一種編碼標準,具體的實現標準可能是utf-8,utf-16,g

[轉]python strbytes之間的轉換

color eth bsp nat alter .com http log com 原文:http://www.cnblogs.com/zqifa/p/python-7.html # bytes object b = b"example" # str object

python strbytes之間的轉換

enc nco odin bsp python body encoding gpo bject 1 # bytes object 2 b = b"example" 3 4 # str object 5 s = "example" 6

python 如何建立bytes、如何轉換str

Python3版本對文字和二進位制資料作了更清晰的區分。文字是Unicode,由str型別表示,二進位制資料則由bytes型別表示。Python3不會在任何地方混用str和bytes,這使得兩者的區分特別清晰。所以不能拼接字串和位元組包,也無法在位元組包裡搜尋字

ctypes 載入的so庫函式引數的字串傳遞問題(strbytes轉換)

在專案開發過程中,需要python使用ctypes 載入編譯好的so庫,然後呼叫so庫的函式,python傳入str引數,但是按通常python傳入字串引數的方法(func(“test”))時,so庫中的函式不能接收到全部的字串,而是隻能接受第一個字元,這樣顯然不能達到呼叫

pythondatetimestr的互相轉化

一、datetime 轉 str   str_date = datetime.now().strftime(“%Y-%m-%d”) ——- (%04d%02d%02d)此種格式化注意 二、str 轉 datetime   start_date = da

python datestr轉化及date之間的運算

1、str 2 date 標頭檔案 import datetime str="20180805" str2date=datetime.datetime.strptime(str,"%Y%m%d")#字串轉化為date形式 date2str=str2date

Python str bytes 型別(Python2/3 對 str 的處理)

本文均在 Python 3 下測試通過,python 2.x 會略有不同。 1. str/bytes >> s = '123' >> type(s) str >> s = b'123' bytes

Pythonossys模塊的區別

mov clear maintain n) 安裝 文件 join() pat 系統 os與sys模塊的官方解釋如下: os: This module provides a portable way of using operating system dependent

python字母ascii碼的相互轉換

需要 編碼 方法 由於 nic 否則 python int bsp 在做python編程時,碰到了需要將字母轉換成ascii碼的,原本以為用Int()就可以直接將字符串轉換成整形了,可是int()帶了一個默認參數,base=10,這裏表示的是十進制,若出現字母,則會報錯,認

Pythonossys兩模塊的區別

des ren 異常類 函數 出現 輸出 func lena info <os和sys的官方解釋> ?os os: This module provides a portable way of using operating system depe

pythonsuper成員屬性

pre pro 類成員方法 特殊 方式 直接 self. 通過 art super的使用直接看例子: class A(): def __init__(self, a): print(‘init A...‘) self.a = a

java stringbytes的轉換總結

set post java lan bsp nbsp 發現 blog fff 最近在和導航設備的通訊服務,和設備通訊時,需要將字符串以UTF-16編碼傳遞。 那如何將string,轉換為byte[]?其實Java提供了現成的實現:java.lang.string.getby

Pythonbreakcontinue的區別

主動 tro 開始 bubuko while 打印 .com pos 結束 1.break 結束循環 count = 0 while count < 10: print(‘hello,Jay‘, count) break count = co

pythonbreakcontinue區別

print 方法 其中 dom 我們 spa strong bre 語法 1.在其他語言中break與continue也被經常使用到,其中用法稍微有些去別,下面我們使用python的語法結構來看看是否和在其他語言中的使用方法一致。 continue:是跳出本次循環,進入到下