python2 中 unicode 和 str 之間的轉換及與python3 str 的區別

在python2中字符串分爲 unicode 和 str 類型前端

  Str To Unicode 使用decode(), 解碼

  Unicode To Str 使用encode(), 編碼

返回數據給前端時須要先將unicode轉換爲str類型, 事實上, python2 中的 str 就是一串字節(byte), 而網絡通訊時, 傳輸的就是字節. 若是前端須要接收json數據, 須要使用 json.dumps() 將數據轉換爲json格式進行返回, 當數據是嵌套類型的數據, 內層的數據可能沒法直接轉換爲str類型的數據, 這時可使用eval()函數進行轉換, 再使用json.dumps()進行轉換爲json格式的數據, json 事實上就是一串字符串.python

python2 默認狀況下 字符串 的類型是 str 類型, 若是須要獲得 unicode 類型的字符串, 須要使用下面的方式進行聲明:web

my_str = u"lowmanisbusy" # 在變量前面加上 u

 在 python2 中若是沒有從新指定字符編碼, 定義中文的字符串時, 須要加上 "u", 指明該字符串爲 unicode 類型, 指定使用unicode編碼對其進行編碼保存:json

my_zh_str = u"渣男不但醜" # 在變量前面加上 u

unicode編碼: unicode編碼爲世界上全部字符都分配了一個惟一編號, 爲十六進制, 如中文簡體漢字 「渣」 的 Unicode編號就是 6E23, 在 python2就是 "\u6e23", 可是unicode僅僅定義了每一個字符的編號,並無定義如何將這個編號進行存儲的方式,因此後來出現了utf-8, gbk等編碼格式, 它們都是 unicode 的一種實現方式, 仍然使用了unicode 中的惟一編號, 我的對其的簡單理解就是在unicode編碼的基礎之上又定義了對字符的存儲方式.網絡

 

在python3中字符串分爲 str 和 bytes 兩種類型框架

    Str To Bytes 使用 encode(), 編碼
    Bytes To Str 使用 decode(), 解碼

這裏須要說明的是, python3 中 bytes 類型的字符串, 就至關於 python2 中 str 類型的字符串, python3中沒有unicode類型的字符串, 這裏其實涉及到默認編碼的問題, python3默認字符編碼爲:utf-8, python2默認字符編碼爲:ASCII, ASCII碼 包含了128個字符, 其中包括全部的英文字符, 阿拉伯數字, 標點符號, 控制符號等, 卻沒有中文, 中文是象形文字, 須要使用到更多的字節進行組合來表示出每一個漢字, 所以ASCII是沒法知足對中文的表示的, 因此 python2中若是沒有從新設置字符編碼的話,代碼中就不容許出現str類型的中文字符串(能夠指定爲unicode類型), 由於Cpython2解釋器沒法識別. 至於 ASCII, UNICODE, UTF-8 之間的關係與區別這裏就不細說了, 能夠自行去了解一下( utf-8編碼  是  unicode編碼 的一種實現方式, 我的理解能夠認爲是下面這樣一種關係: utf-8 <---> unicode <--->byte, 最終,數據的傳輸仍然是以二進制的形式一個一個字節進行傳輸的)
函數

默認狀況下,python3中字符串的類型爲 str, 在web框架中, 會自動將 str轉換成 byte 向前端返回.編碼

當須要將某種編碼格式的bytes轉換另一種編碼格式的bytes時須要先按原來的編碼格式進行解碼成str類型, 再使用新的編碼格式轉換爲bytes類型spa

如: 若存在變量 my_bt, 其爲編碼格式 gbk 的 bytes, 需將其轉換爲utf-8的編碼格式,須要進行以下的處理:code

  my_str = my_bt.decode("gbk")  # 解碼

  my_bt = my_str.encode("utf-8") # 從新編碼

 由於 python3 中沒有 unicode 類型的字符串, 全部在 python3 中使用下面這種方式定義字符串是沒有意義的

my_str = u"渣男不但醜"

 

我的理解, 有何錯誤,請幫忙指正,多謝!

相關文章
相關標籤/搜索