# 6.1.編碼/解碼器的基本概念

## 1.Introduction

* 編碼(encode) /解碼(decode)
  * 編碼就是將**字符**轉為**位元組**的過程與演算法&#x20;
  * 解碼就是將**位元組**轉為**字符**的過程與演算法&#x20;
* 字符集 (字碼)
  * 各種文字及符號的總稱, 例如常見的有:
    * ASCII
    * GBK
    * Unicode
  * 以Unicode編碼為例, 其字碼為4\~6個16進位數字, 並在前面加上**U+**
    * 英文字母A的Unicode字碼: U+0041
    * 歐元符號: U+20AC&#x20;
* 字符編碼
  * 將**字符集**轉為**二進位**&#x20;
  * 例如**ASCII字符編碼**可將**ASCII字符集中的128個字符**轉為**二進制**
  * 代表字元的**位元組**會根據使用的編碼而定, 例如Unicode只定義了字符集以及每個字符對應到的唯一編碼值(code point), 編碼演算法則有UTF-8, UTF-16, UTF-32
  * 編碼是一種演算法, 可互相轉換**字碼**
    * 以A的**位元組**為例
      * UTF-8編碼: \x41
      * UTF-16LE編碼: \x41\x00

## 2.Python的操作

* Python中的字串類型有兩種: str跟bytes, 也就是對應到前一個部分所說的**字符**轉為**位元組(16進位)**,&#x20;
  * python編輯界面和運行界面, 通常都是默認str為unicode編碼
  * unicode str的表示方式有兩種: u'字符串'或者'\u四位16進位數'. 它們是等價的, 而且都是str對象
  * 當bytes中的字節符合ASCII碼的可顯示字符時, 這個字節就會按照ASCII碼來顯示, 否則就會以16進位顯示

```
     >>> u'\x40\x41'
    u'@A'
```

* 若要宣告的字串為bytes形式, 可以在字串前加上b

  ```
  >>> b'\x40\x41' 
  '@A'
  ```
* str可以通過encode轉化为bytes, bytes可以通過decode轉化为str

```
    s = 'cafe'
    # str 'cafe'有四個unicode字元

    >>> b= s.encode('utf8')
    >>> b
    'cafe'
    # 用utf-8將str編碼成bytes

    >>> b.decode('utf8')
    u'cafe'
    # 用utf-8將bytes編碼成str
```
