日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python2默认编码_解决Python2.x编码之殇

發(fā)布時(shí)間:2024/9/3 python 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python2默认编码_解决Python2.x编码之殇 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Python編碼問(wèn)題一直困擾了我許久,之前有過(guò)一些總結(jié),但并不系統(tǒng),比較凌亂。當(dāng)然python2.x編碼問(wèn)題本身,便是剪不斷理還亂。本篇將系統(tǒng)介紹python2.x編程中會(huì)遇到的一些編碼問(wèn)題,并給出解決方案。基于對(duì)編碼問(wèn)題的摸索了解,我也嘗試寫(xiě)了一個(gè)編碼轉(zhuǎn)換模塊Transcode,應(yīng)該能解決絕大部分新手的疑難雜癥。當(dāng)然,python大神可以繞道而行,至于使用3.x的朋友,以后將會(huì)成文介紹。

python編程中會(huì)經(jīng)常遇到操作系統(tǒng)編碼、文件編碼、控制臺(tái)輸入輸出編碼、網(wǎng)頁(yè)編碼、源代碼編碼、python編碼,本文將會(huì)逐一介紹。首先我們來(lái)看看一些常見(jiàn)的編碼情況:

print sys.getdefaultencoding() #系統(tǒng)默認(rèn)編碼

print sys.getfilesystemencoding() #文件系統(tǒng)編碼

print locale.getdefaultlocale() #系統(tǒng)當(dāng)前編碼

print sys.stdin.encoding #終端輸入編碼

print sys.stdout.encoding #終端輸出編碼

將以上這段代碼在windows與linux系統(tǒng)下分別運(yùn)行,查看輸出結(jié)果。

windows終端結(jié)果:

ascii

mbcs

('zh_CN', 'cp936')

cp936

cp936

Linux終端結(jié)果:

ascii

UTF-8

('zh_CN', 'UTF-8')

UTF-8

UTF-8

操作系統(tǒng)編碼

操作系統(tǒng)默認(rèn)編碼可以通過(guò)sys.getdefaultencoding()函數(shù)獲取,可以看到windows與linux下默認(rèn)都為ascii編碼,而我們知道ascii編碼不支持中文。那么操作系統(tǒng)編碼將在python程序的何處會(huì)被用到呢?何時(shí)又會(huì)引發(fā)血案?

觸發(fā)異常點(diǎn)

經(jīng)過(guò)測(cè)試,我發(fā)現(xiàn)當(dāng)需要將unicode格式的字符串存入到文件時(shí),python內(nèi)部會(huì)默認(rèn)將其先轉(zhuǎn)換為Str格式的系統(tǒng)編碼,然后再執(zhí)行存入步驟。而在這過(guò)程中,容易引發(fā)ascii異常。

實(shí)例證明:

#! -*- coding:utf-8 -*-

a=u"中文"

f=open("test.txt","w")

f.write(a)

報(bào)錯(cuò)異常信息:UnicodeEncodeError: ‘a(chǎn)scii’ codec can’t encode characters in position 0-1……

說(shuō)明:因?yàn)閍scii不支持中文,而變量a為unicode格式的中文字符串,因此無(wú)法進(jìn)行編碼而引發(fā)異常。

解決方案

設(shè)置系統(tǒng)編碼為utf-8或者gbk。

import sys

reload(sys)

sys.setdefaultencoding('gbk')

說(shuō)明:在windows下將其設(shè)置為gbk,在linux在設(shè)置為utf-8.

終端編碼

windows下終端指的是控制臺(tái),在控制臺(tái)上輸入輸出有著其本身的編碼格式,如windows控制臺(tái)輸入輸出編碼都為cp936。原諒我是第一次看到此編碼,于是上網(wǎng)查了會(huì),發(fā)現(xiàn)其實(shí)它就是常見(jiàn)的GBK編碼;而linux終端的輸入輸出編碼都為utf-8。如果我們編寫(xiě)的程序,不會(huì)再終端輸入輸出任何內(nèi)容,則可以忽略此編碼,如若不然終端編碼將會(huì)非常重要。

亂碼點(diǎn)

我們?cè)诮K端執(zhí)行python腳本時(shí),經(jīng)常會(huì)遇到輸出中文亂碼,而這往往是因?yàn)檩敵龅淖址旧砭幋a與控制臺(tái)編碼不一致。

實(shí)例證明:

#! -*- coding:utf-8 -*-

a="中文" #定義一個(gè)變量,默認(rèn)為Str,utf-8編碼

print a

print type(a)

windows控制臺(tái)輸出結(jié)果:

浣犲ソ

linux終端輸出結(jié)果:

中文

造成這種差異的原因在于windows控制臺(tái)為gbk編碼,而變量a本身為utf-8編碼。

解決方案

#! -*- coding:utf-8 -*-

a='你好'

b=a.decode("utf-8").encode("gbk")

print b

將變量a從utf-8編碼轉(zhuǎn)換為gbk編碼。

python編碼

python2.x從外部獲取的內(nèi)容都是string編碼,其內(nèi)部分為String編碼與Unicode編碼,而String編碼又分為UTF-8,GBK,GB2312等等。因此為了避免不同編碼造成的報(bào)錯(cuò),python內(nèi)部最好都轉(zhuǎn)化為unicode編碼,在輸出時(shí)再轉(zhuǎn)化為str編碼 。可以用encode()/decode()函數(shù),將string與unicode編碼互換。

觸發(fā)異常點(diǎn)

基本在于python內(nèi)部變量編碼與控制臺(tái)編碼,或者其他編碼相結(jié)合時(shí)觸發(fā)。

實(shí)例證明:

#! -*- coding:utf-8 -*-

a="中文" #定義一個(gè)變量,默認(rèn)為str,utf-8編碼

print a

print type(a)

運(yùn)行結(jié)果:

浣犲ソ

說(shuō)明:windows下控制臺(tái)輸入輸出都是gbk編碼格式,而代碼中定義的變量a為str,utf-8格式,所以會(huì)出現(xiàn)亂碼。如果想創(chuàng)建一個(gè)unicode編碼字符串的變量,則可以a=u”123”,在雙引號(hào)前面加上一個(gè)u,表示a為unicode編碼。

解決方案

#! -*- coding:utf-8 -*-

a='你好'

print a.decode("utf-8").encode("gbk")

說(shuō)明:首先我們定義的變量a是str格式,編碼為utf-8的字符串,我們要將之轉(zhuǎn)化為str格式,GBK編碼的字符串。在python內(nèi)部無(wú)法直接轉(zhuǎn)化,需要借助decod()與encode()函數(shù)。decode()函數(shù)先將str格式的字符串a(chǎn)轉(zhuǎn)化為unicode,再將unicode編碼為str格式GBK。而在Unix系統(tǒng)下,不存在這個(gè)問(wèn)題,因?yàn)槎际莡tf-8編碼,不會(huì)存在亂碼。print語(yǔ)句默認(rèn)會(huì)將unicode編碼的字符串,encode為相應(yīng)系統(tǒng)的str編碼并輸出(windows下為gbk,unix下為utf-8),因此不用擔(dān)心print unicode編碼字符串會(huì)報(bào)錯(cuò)。

源代碼編碼

源代碼編碼指的是python程序本身的編碼,默認(rèn)為ascii。

觸發(fā)異常點(diǎn)

python程序本身要被解釋器解析執(zhí)行,需要先被轉(zhuǎn)化為二進(jìn)制代碼。而在這過(guò)程中容易引發(fā)異常,原因同樣是ascii不支持中文,因此當(dāng)python程序中出現(xiàn)中文時(shí),哪怕是注釋,也會(huì)引發(fā)ascii異常。

實(shí)例證明:

print "中文" #中文注釋

報(bào)錯(cuò):SyntaxError: Non-ASCII character ‘\xe7’……

解決方案

#! -*- coding:utf-8 -*-

python程序開(kāi)頭加上這句代碼,指定python源代碼編碼格式為utf-8。

文件編碼

文件編碼指的是,python程序從文件中獲取的內(nèi)容的編碼格式。可以用sys.getfilesystemencoding()函數(shù)獲取,windows下為mbcs,linux下為utf-8。至于mbcs,是一種多字節(jié)編碼(沒(méi)搞很明白)。

觸發(fā)異常點(diǎn)(讀取文件內(nèi)容)

當(dāng)python程序從文件中獲取內(nèi)容,并輸出時(shí),容易觸發(fā)異常。

實(shí)例證明:

#! -*- coding:utf-8 -*-

f=open("test.txt","r")

content=f.read()

print type(content)

print content

運(yùn)行結(jié)果:

你好

可以看到windows下,從文件中讀取的編碼格式為Str,GBK格式(因?yàn)榭刂婆_(tái)輸出沒(méi)有中文亂碼);而在Unix下為Str,Utf-8格式。從輸出內(nèi)容來(lái)說(shuō),并沒(méi)有觸發(fā)異常,然而當(dāng)這些內(nèi)容與python程序自身內(nèi)容相結(jié)合時(shí),容易觸發(fā)異常。

解決方案

在windows下,最好將文件內(nèi)容轉(zhuǎn)為unicode,可以使用codecs:

f=codecs.open("test.txt", encoding='gbk').read()

將格式為gbk的文件內(nèi)容轉(zhuǎn)化為unicode格式,當(dāng)然也可以直接使用open(“”,”r”).read().decode(“gbk”)

觸發(fā)異常點(diǎn)(寫(xiě)入文件內(nèi)容)

參考操作系統(tǒng)編碼觸發(fā)異常點(diǎn),即將中文unicode字符寫(xiě)入文件時(shí),容易觸發(fā)異常。

解決方案

參考操作系統(tǒng)編碼解決方案,或者手動(dòng)將unicode編碼轉(zhuǎn)換為str編碼。

實(shí)例證明:

#! -*- coding:utf-8 -*-

a=u"中文" #a為unicode格式編碼

f=open("test.txt","w")

f.write(a.encode("gbk"))

當(dāng)然如果變量a本身就是Str則不會(huì)報(bào)錯(cuò),只是utf-8編碼的內(nèi)容寫(xiě)入windows文件中,顯示會(huì)亂碼。

網(wǎng)頁(yè)編碼

網(wǎng)頁(yè)編碼,通常在寫(xiě)爬蟲(chóng)的時(shí)候經(jīng)常遇到,再結(jié)合系統(tǒng)編碼,python編碼,文件編碼,往往會(huì)搞得一團(tuán)亂。在程序中我們應(yīng)該分別處理這些編碼,在python內(nèi)部全部轉(zhuǎn)化為unicode。那么網(wǎng)頁(yè)編碼又有哪些格式呢?

常見(jiàn)格式:utf-8,gbk,gb2312

觸發(fā)異常點(diǎn)

還是在于從網(wǎng)頁(yè)中獲取的源碼編碼與終端編碼,甚至python內(nèi)部編碼不一致的情況。

實(shí)例證明:

#!coding=utf-8

import urllib2

body=urllib2.urlopen('http://thief.one').read()

print type(body)

print body

運(yùn)行結(jié)果:

body中文顯示亂碼

說(shuō)明:這個(gè)網(wǎng)站的編碼是utf-8,而且python從網(wǎng)頁(yè)上爬取的內(nèi)容都為Str格式,在windows控制臺(tái)下輸出會(huì)亂碼。

解決方案

依照之前做法,先將其轉(zhuǎn)化為unicode。而相應(yīng)的正則也可以為unicode編碼,如:res=r’’+u”新成員”。可以通過(guò)chardet模塊判斷網(wǎng)頁(yè)編碼類型,返回的是一個(gè)帶概率的字典。

編碼判斷

判斷字符串編碼

isinstance(obj, (str, unicode))

返回True或者False

判斷網(wǎng)頁(yè)編碼

import chardet

import urllib2

body=urllib2.urlopen("http://thief.one").read()

chardet.detect(body)

判斷編碼格式,會(huì)有百分比,一般用來(lái)判斷網(wǎng)頁(yè)編碼比較好。

判斷系統(tǒng)編碼

print sys.getdefaultencoding() #系統(tǒng)默認(rèn)編碼

print sys.getfilesystemencoding() #文件系統(tǒng)編碼

print locale.getdefaultlocale() #系統(tǒng)當(dāng)前編碼

print sys.stdin.encoding #終端輸入編碼

print sys.stdout.encoding #終端輸出編碼

python2.x編碼建議請(qǐng)盡量在Linux系統(tǒng)上編程,綜上我們可以知道linux下較windows,編碼問(wèn)題良好很多。

python代碼內(nèi)部請(qǐng)全部使用unicode編碼,在獲取外部?jī)?nèi)容時(shí),先decode為unicode,向外輸出時(shí)再encode為Str

在定義變量或者正則時(shí),也定義unicode字符,如a=u”中文”;res=r””+u”正則”。

其他疑難雜癥

實(shí)例一:

a="\\u8fdd\\u6cd5\\u8fdd\\u89c4"

print a

變量a的內(nèi)容本身為unicode編碼,怎么正常顯示輸入?

解決方案:

a="\\u8fdd\\u6cd5\\u8fdd\\u89c4" # unicode轉(zhuǎn)化為中文

b=a.decode('unicode-escape')

print b

如果閱讀完本章,增加了您對(duì)python編碼問(wèn)題的認(rèn)識(shí),那我會(huì)感到欣慰,如有python編碼上的問(wèn)題可以在下方留言。

如果閱讀完本章,您仍然不知如何解決python亂碼問(wèn)題,沒(méi)關(guān)系,請(qǐng)繼續(xù)移步閱讀Transcode解決python編碼問(wèn)題

為了能夠讓您重視,我不得不再次重申:解決python2.x編碼問(wèn)題的關(guān)鍵,在于要明白無(wú)論從哪里來(lái)的內(nèi)容,在python內(nèi)部流通時(shí),都應(yīng)該先轉(zhuǎn)換為unicode。(python3.x在這方面做了改進(jìn),并取得了很好的效果)技術(shù)的探索,就好像編織故事一般,其樂(lè)趣在于偶爾能夠講述給別人聽(tīng),并獲得一些贊同!

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的python2默认编码_解决Python2.x编码之殇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。