|
以下依次列出python2常遇到的幾個(gè)問題及講解。
# -*- coding:utf-8 -*- python2默認(rèn)以ASCII編碼,但是在實(shí)際編碼過程中,我們會(huì)用到很多中文,為了不使包含中文的程序報(bào)錯(cuò),也是為了符合國際通用慣例,一般將我們的文件編碼設(shè)置為utf-8格式。 設(shè)定編碼的格式有很多種,只要第一行或者第二行的聲明符合正則表達(dá)式 "coding[:=]\s*([-\w.]+)" 即可,一般的聲明方式為#-*- coding:utf-8 -*-。
運(yùn)行以上代碼,程序會(huì)報(bào)錯(cuò):SyntaxError: Non-ASCII character '\xe4' in file D:/TestPython/test/111.py on line 1, but no encoding declared; see http:///dev/peps/pep-0263/ for details。這是提示程序中有非ASCII編碼的字符。如果加上utf-8聲明,程序就不會(huì)報(bào)錯(cuò)。
雖然以上寫法不會(huì)報(bào)錯(cuò),但是輸出的卻是亂碼,為什么呢?這就是下面要講的內(nèi)容。
encode和decode 講解編碼和解碼之前,先來講講Unicode和utf-8的關(guān)系,推薦這篇博客給大家。 可以這樣來理解:字符串是由字符構(gòu)成,字符在計(jì)算機(jī)硬件中通過二進(jìn)制形式存儲(chǔ),這種二進(jìn)制形式就是編碼。如果直接使用 “字符串??字符??二進(jìn)制表示(編碼)” ,會(huì)增加不同類型編碼之間轉(zhuǎn)換的復(fù)雜性。所以引入了一個(gè)抽象層,“字符串??字符??與存儲(chǔ)無關(guān)的表示??二進(jìn)制表示(編碼)” ,這樣,可以用一種與存儲(chǔ)無關(guān)的形式表示字符,不同的編碼之間轉(zhuǎn)換時(shí)可以先轉(zhuǎn)換到這個(gè)抽象層,然后再轉(zhuǎn)換為其他編碼形式。在這里,unicode 就是 “與存儲(chǔ)無關(guān)的表示”,utf—8 就是 “二進(jìn)制表示”。
python2中字符串有兩種表示形式,str和unicode。str可以理解為上面這段話中的二進(jìn)制編碼格式,unicode可以理解為抽象層。encode是編碼,即從unicode格式到二進(jìn)制的編碼格式如utf-8、gb2312等。decode是解碼,即從二進(jìn)制編碼格式到unicode編碼格式。
下面請(qǐng)看代碼:
# -*- coding:utf-8 -*- str1是str類型, 通過decode轉(zhuǎn)為了unicode類型。 下面看encode代碼:
str1是unicode類型,通過encode轉(zhuǎn)為了str類型。
我們?cè)倩仡^看最開始留下的問題,那段代碼為什么會(huì)輸出亂碼呢。因?yàn)槲募?guī)定的編碼格式是utf-8,但是我們print是打印到控制臺(tái)的,控制臺(tái)無法顯示utf-8編碼格式的字符。所以我們要轉(zhuǎn)一下格式。
很多時(shí)候編碼解碼的時(shí)候需要加ignore參數(shù)才能正確轉(zhuǎn)換,例如.encode('utf-8', 'ignore')或.decode('utf-8', 'ignore'),大家自行斟酌吧。
chardet獲取編碼格式 有些時(shí)候我們是無法知道字符串是什么編碼的,比如抓取網(wǎng)頁時(shí),有些是utf-8的,有些是gb2312編碼的,那我們?cè)撛趺传@取編碼格式并轉(zhuǎn)換為unicode呢。這里就介紹到一個(gè)第三方庫chardet。使用方式大概如下:
code即為str的編碼格式。但有些人反映該方法得到的編碼格式不準(zhǔn)確,速度也慢。本人親測,速度確實(shí)一般,但是目前還沒遇到不準(zhǔn)確的情況。大家可以斟酌使用,我這里只是提供一個(gè)思路,如果誰那里有更好的方式,可以告知小弟,不吝賜教才是。
import sys reload(sys) sys.setdefaultencoding('utf8') 之前也遇到過很莫名其妙的編碼錯(cuò)誤,網(wǎng)上搜到這種方法能解決就糊里糊涂的用上了,也不知是什么原理。今天看到一篇不錯(cuò)的博客,推薦給大家:http://blog.csdn.net/crazyhacking/article/details/39375535。以下內(nèi)容引用自該篇文章:
但是這種方式用著就是別扭,還是盡量自己來控制編碼,明確了編碼格式,自己寫著也踏實(shí)。
個(gè)人總結(jié) 實(shí)際編程過程中,最好能在代碼內(nèi)統(tǒng)一編碼格式,比如統(tǒng)一為unicode,因?yàn)檫@樣就不用考慮編碼的問題了。到了顯示或輸出時(shí)再轉(zhuǎn)換為存儲(chǔ)類型(utf-8、GBK)。
以上為最近編寫python代碼的過程中遇到的一些問題及總結(jié),如果有什么不對(duì)的地方還請(qǐng)大家及時(shí)回復(fù)交流,在此謝過。
|
|
|