Python 字元編碼

來源:互聯網
上載者:User

標籤:儲存空間   告訴   不同   混合   最大   記事本   with   產生   解釋   


ASCII編碼:
電腦只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。最早的電腦在設計時採用8個位元(bit)作為一個位元組(byte),所以,一個位元組能表示的最大的整數就是255,最多隻能表示2**8個不同的字元
由於電腦是美國人發明的,因此,最早只有127個字母被編碼到電腦裡,也就是大小寫英文字母、數字和一些符號,這個編碼錶被稱為ASCII編碼,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
但是要處理中文顯然一個位元組是不夠的,至少需要兩個位元組,而且還不能和ASCII編碼衝突,所以,中國制定了GB2312編碼,用來把中文編進去。全世界有上百種語言,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。

Unicode編碼:
因此,萬國碼(Unicode)應運而生。Unicode編碼“至少”2個位元組即16位,把所有語言都統一到一套編碼裡,這樣就解決了亂碼的問題,現代作業系統和大多數程式設計語言都直接支援Unicode。

UTF-8 : 
UTF-8編碼可理解為可變長的編碼,目的是為了節約儲存空間,把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字一般是3個位元組。

字元編碼的轉換
現在電腦系統通用的字元編碼工作方式:在電腦記憶體中,統一使用Unicode編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為UTF-8編碼。
用記事本編輯的時候,從檔案讀取的UTF-8字元被轉換為Unicode字元到記憶體裡,編輯完成後,儲存的時候再把Unicode轉換為UTF-8儲存到檔案。瀏覽網頁的時候,伺服器會把動態產生的Unicode內容轉換為UTF-8再傳輸到瀏覽器,所以很多網頁的源碼上會有類似<meta charset="UTF-8" />的資訊,表示該網頁正是用的UTF-8編碼
unicode=>utf8: encode編碼
utf8=>unicode: decode解碼
utf8=>unicode=>gbk: utf8轉換成gbk需要經過unicode

因為Python的誕生比Unicode標準發布的時間還要早,所以最早的Python只支援ASCII編碼,普通的字串‘ABC‘在Python內部都是ASCII編碼的,Python在後來添加了對Unicode的支援。
Python3.x 的字串類型是str,在記憶體中以Unicode表示,一個字元對應若干個位元組。
如果要在網路上傳輸,或者儲存到磁碟上,就需要把str變為以位元組為單位的bytes,Python對bytes類型的資料用帶b首碼的單引號或雙引號表示: x = b‘ABC‘ 雖然b‘ABC‘和‘ABC‘內容顯示一樣,但bytes的每個字元都只佔用一個位元組。
以Unicode表示的str通過encode()方法可以編碼為指定的bytes (ascii或 utf-8) 
>>> ‘ABC‘.encode(‘ascii‘) 
b‘ABC‘
>>> type(b‘ABC‘) 
<class ‘bytes‘>
>>> ‘中文‘.encode(‘utf-8‘)
b‘\xe4\xb8\xad\xe6\x96\x87‘

反過來,如果我們從網路或磁碟上讀取了位元組流,那麼讀到的資料就是bytes。要把bytes變為str,就需要用decode()方法
>>> b‘ABC‘.decode(‘ascii‘)
‘ABC‘
>>> b‘\xe4\xb8\xad\xe6\x96\x87‘.decode(‘utf-8‘)
‘中文‘

用len()Function Computestr的字元數,如果換成bytes,就計算位元組數:
>>> len(‘ABC‘)
3
>>> len(‘中文‘)
2
>>> len(b‘ABC‘)
3
>>> len(‘中文‘.encode(‘utf-8‘))
6
可見,1個中文字元經過UTF-8編碼後通常會佔用3個位元組,而1個英文字元只佔用1個位元組。

str和bytes互相轉換時,需要指定編碼,最常用的編碼是UTF-8。Python當然也支援其他編碼方式,比如把Unicode編碼成GB2312,如果沒有特殊業務要求,僅使用UTF-8編碼。在操作字串時,為了避免亂碼問題,應當始終堅持使用UTF-8編碼對str和bytes進行轉換。

由於Python原始碼也是一個文字檔,所以,當你的原始碼中包含中文的時候,在儲存原始碼時,就需要務必指定儲存為UTF-8編碼。當Python解譯器讀取原始碼時,為了讓它按UTF-8編碼讀取,我們通常在檔案開頭寫上這兩行:

#!/usr/bin/env python --告訴Linux/OS X系統,這是一個Python可執行程式,Windows系統會忽略這個注釋;
# -*- coding: utf-8 -*- --告訴Python解譯器,按照UTF-8編碼讀取原始碼,否則,你在原始碼中寫的中文輸出可能會有亂碼。
聲明了UTF-8編碼並不意味著你的.py檔案就是UTF-8編碼的,必須並且要確保文字編輯器正在使用UTF-8 without BOM編碼,如果.py檔案本身使用UTF-8 編碼,並且也申明了# -*- coding: utf-8 -*-,開啟命令提示字元測試就可以正常顯示中文

註:Python3.x 解譯器預設按UTF-8編碼讀取源碼,不需要聲明

 

Python 字元編碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.