字符編碼和python使用encode,decode轉換utf-8, gbk, gb2312

ASCII碼

標準ASCII碼使用7位二進制數表示大寫或小寫字母,數字0到9標點符號以及在美式英語中使用的特殊控制字符。html

在標準ASCII碼中,最高位(b7)用做奇偶校驗位,所謂奇偶校驗,是指在代碼傳送過程當中用來檢驗是否出現錯誤的一種方法,通常分寄校驗和偶校驗兩種。奇校驗規定:正確的代碼一個字節中1的個數必須是奇數,若非奇數,則在最高位b7添1;偶校驗規定:正確的代碼一個字節中1的個數必須是偶數,若非偶數,則在最高位b7添1。python

後128個稱爲擴展ASCII碼。許多基於x86的系統都支持使用擴展(或「高」)ASCII。擴展ASCII 碼容許將每一個字符的第8 位用於肯定附加的128 個特殊符號字符、外來語字母和圖形符號。windows

常見的ASCII碼大小:編碼

換行LF爲0x0A,回車CR爲0x0D,空格爲0x20,'0'爲0x30,‘A’爲0x41,'a'爲0x61url

查詢ASCII技巧,方便查詢ASCII碼對應的字符:新建一個文本文檔,按住ALT+要查詢的碼值(注意,這裏是十進制),鬆開便可顯示出對應字符。例如:按住ALT+97,則會顯示出'a'。spa

擴展ASCII碼

擴展ASCII碼是從128-255的字符。.net

Unicode編碼

注意:Unicode只是一個符號集,它規定了符號的二進制代碼,卻沒有規定二進制代碼如何存儲。日誌

所稱的Unicode編碼指的是UCS編碼方式,即直接存入符號的Unicode二進制代碼。code

UTF-8編碼

UTF-8是互聯網上使用最廣的一種Unicode的實現方式。htm

UTF-8是一種變長的編碼方式,它使用1-4個字節表示一個符號,根據不一樣的符號選擇不一樣長度的字節表示。

UTF-8的編碼規則很簡單,只有二條:

1)對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的unicode碼。所以對於英語字母,UTF-8編碼和ASCII碼是相同的。

2)對於n字節的符號(n>1),第一個字節的前n位都設爲1,第n+1位設爲0,後面字節的前兩位一概設爲10。剩下的沒有說起的二進制位,所有爲這個符號的unicode碼。

Unicode符號範圍(16進制) UTF-8編碼方式(2進制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

跟據上表,解讀UTF-8編碼很是簡單。若是一個字節的第一位是0,則這個字節單獨就是一個字符;若是第一位是1,則連續有多少個1,就表示當前字符佔用多少個字節。

Unicode與UTF-8的轉換方式:

在Windows系統最簡單的方式是採用記事本打開文檔而後選擇編碼方式另存爲。

解決python亂碼問題

字符串在python內部中是採用unicode的編碼方式,因此其餘語言先decode轉換成unicode編碼,再encode轉換成utf8編碼。編碼是一種用二進制數據表示抽象字符的方式,utf8是一種編碼方式。

代碼中的字符串編碼默認和代碼文件編碼相同。

python2中的unicode和python3中的str等價。能夠查看s.__class__,若是爲<class 'str'>則爲unicode編碼及文本數據,若是爲<class 'bytes'>則爲utf8編碼及二進制數據。str(s, 'utf8')和s.decode('utf8')等價。

若是字符串在代碼中被定義爲s=u'中文',則s就是python內部編碼unicode。

unicode類型再解碼會報錯。

判斷一個字符串是否爲unicode方法isinstance(s, unicode),python2中的unicode和python3中的str等價,因此在python3中判斷一個字符串是否爲unicode方法爲isinstance(s, str)。

獲取系統默認編碼:

import sys
print(sys.getdefaultencoding())

有些IDE輸出亂碼是由於控制檯不能輸出字符串的編碼不是程序自己的問題。好比windows的控制檯是gb2312,則utf8的輸出格式不能正確輸出。

一種輸出格式爲gb2312避免亂碼的方式:

 1 #coding=utf-8
 2 
 3 s='中文'
 4 
 5 
 6 if(isinstance(s, str)):
 7 #s爲u'中文'
 8     s.encode('gb2312')
 9 else:
10 #s爲'中文'
11     s.decode('utf8').encode('gb2312')

採用標準庫codecs模塊

codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1)
1 import codecs
2 f = codecs.open(filename, encoding='utf-8')

使用上邊這種方式讀進來utf-8文件,會自動轉換爲unicode。但必須明確該文件類型爲utf8類型。若是是文件中有漢字,不是一個字節一個字節地讀而是整個漢字的全部字節讀進來而後轉換成unicode(猜測跟漢字的utf8編碼有關)。

下邊的代碼也是一種使用codecs的讀寫方式

#coding=utf-8
import codecs

fin = open("test.txt", 'r')
fout = open("utf8.txt", 'w')

reader = codecs.getreader('gbk')(fin)
writer = codecs.getwriter('gbk')(fout)

data = reader.read(10)
#10是最大字節數,默認值爲-1表示儘量大。能夠避免一次處理大量數據
while data:
    writer.write(data)
    data = reader.read(10)

 

借鑑:

ASCII_百度百科

阮一峯的日誌

Python字符串的encode和decode研究心得——解決亂碼問題

How to make unicode with python3

Difference between open and codecs.open in python

codecs——Codec registry and base classes

Python 3的bytes/str之別 codecs模塊

相關文章
相關標籤/搜索