python中使用字節類型(bytes)來表示二進制信息,它是由單個字節構成的不可變序列。
字節類型的字面量的語法與字符串大致相同,只是添加了一個前綴`b`。
字節類型的字面量中只允許`ASCII`字符。
任何超過`127`的二進制值使用前綴`\x`和十六進制來表示。
## 編碼與解碼
字符串轉換為對應的編碼稱為編碼,根據字符編碼轉換為字符叫解碼。
### 編碼
字符串方法`.encode()`可以將字符串轉換為對應的編碼的`bytes`對象。
```python
>>> res = 'abc123'.encode('ascii')
>>> res
b'abc123'
>>> type(res)
bytes
```
因為都是ascii碼字符,使用本身字面量來表示,所以看起來和字符串沒有什么區別,除了多了一個前綴`b`。
```python
>>> res = '中'.encode('gbk')
>>> res
b'\xd6\xd0'
>>> len(res)
2
```
`中`字在`gbk`中的編碼為`54992`,二進制表示為:
```python
>>> bin(54992)
'0b1101011011010000'
```
總共16位,需要兩個字節來表示,按照16進制表示第一個字節為:
```python
>>> hex(0b11010110)
'0xd6'
```
第二個字節為:
```python
>>> hex(0b11010000)
'0xd0'
```
換成`\x`前綴后為:
```
'\xd6\xd0'
```
是不是跟上面的結果一樣。
```python
>>> res = '中'.encode('utf-8')
b'\xe4\xb8\xad'
```
`utf-8`碼,三個字節表示一個漢字。
### 解碼
bytes對象方法`.decode()`可以將字節對象轉換為對應編碼的字符串對象。
```python
>>> b'\xd6\xd0'.decode('gbk')
'中'
```
注意:不是所有的二進制信息都可以解碼為字符,只有以字符編碼組織的二進制信息才可以解碼為字符。當二進制信息不是以字符編碼組織的,或者使用錯誤的字符編碼進行解碼會拋出異常。
```python
>>> b'\xd6\xd0'.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
```
注意:為了解決字符串不一致的問題,python3中,所有的字符串在內存中都是以`unicode`來表示的,其它的編碼再通過`uniocde`進行轉換。
```python
>>> '中'.encode('unicode_escape')
b'\\u4e2d' # unicode
>>> b'\\u4e2d'.decode()
>>> b'\\u4e2d'.decode('unicode_escape')
'中'
```
- 第1章 編程基礎
- 零基礎能學Python嗎?
- 編程語言是什么
- 編譯型與解釋型編程語言的區別
- python是什么?
- 學python能干什么?
- 第2章 python開發環境搭建
- windows下安裝python
- cmd命令行工具
- 環境變量如何設置?
- 如何運行python程序?
- 學習神器Jupyter lab
- 第3章 基本數據類型
- 基本數據類型概述
- 變量的定義和使用
- 整數類型
- 浮點數類型
- 算術運算符
- 賦值運算符
- 字符串類型
- 字符串常用方法
- 字符串格式化
- 列表類型
- 元組類型
- 可變與不可變類型
- 深淺拷貝
- 集合類型
- 字典類型
- 布爾型
- NoneType
- 第4章 程序流程控制
- 程序結構
- if分支語句
- while條件循環
- for循環
- 循環控制關鍵字
- 異常處理
- 第5章函數與代碼復用
- 函數的定義和調用
- 函數的參數
- 函數的返回值
- lambda函數
- 變量作用域
- python內建函數
- 第6章 面向對象
- 類和對象
- 屬性
- 方法
- 繼承
- super()函數
- 多態
- 私有化
- 自省與反射機制
- 第7章 模塊和包
- 模塊
- 包
- 第三方庫
- 第8章 文件IO操作
- 文件概述
- 字符編碼
- 字節類型
- python讀取文件
- python寫文件
- 文件指針