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


ASCII碼

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

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

后128個稱為擴展ASCII碼。許多基於x86的系統都支持使用擴展(或“高”)ASCII。擴展ASCII 碼允許將每個字符的第8 位用於確定附加的128 個特殊符號字符、外來語字母和圖形符號。

常見的ASCII碼大小:

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

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

擴展ASCII碼

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

Unicode編碼

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

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

UTF-8編碼

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

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模塊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM