国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - python 中文亂碼問(wèn)題深入分析

python 中文亂碼問(wèn)題深入分析

2020-06-27 12:01Python教程網(wǎng) Python

一直以來(lái),python中的中文編碼就是一個(gè)極為頭大的問(wèn)題,經(jīng)常拋出編碼轉(zhuǎn)換的異常,python中的str和unicode到底是一個(gè)什么東西呢?

在本文中,以'哈'來(lái)解釋作示例解釋所有的問(wèn)題,“哈”的各種編碼如下:
1. UNICODE (UTF8-16),C854;
2. UTF-8,E59388;
3. GBK,B9FE。
一、python中的str和unicode
一直以來(lái),python中的中文編碼就是一個(gè)極為頭大的問(wèn)題,經(jīng)常拋出編碼轉(zhuǎn)換的異常,python中的str和unicode到底是一個(gè)什么東西呢?
在python中提到unicode,一般指的是unicode對(duì)象,例如'哈哈'的unicode對(duì)象為
u'\u54c8\u54c8'
而str,是一個(gè)字節(jié)數(shù)組,這個(gè)字節(jié)數(shù)組表示的是對(duì)unicode對(duì)象編碼(可以是utf-8、gbk、cp936、GB2312)后的存儲(chǔ)的格式。這里它僅僅是一個(gè)字節(jié)流,沒有其它的含義,如果你想使這個(gè)字節(jié)流顯示的內(nèi)容有意義,就必須用正確的編碼格式,解碼顯示。
例如:
python 中文亂碼問(wèn)題深入分析

對(duì)于unicode對(duì)象哈哈進(jìn)行編碼,編碼成一個(gè)utf-8編碼的str-s_utf8,s_utf8就是是一個(gè)字節(jié)數(shù)組,存放的就是'\xe5\x93\x88\xe5\x93\x88',但是這僅僅是一個(gè)字節(jié)數(shù)組,如果你想將它通過(guò)print語(yǔ)句輸出成哈哈,那你就失望了,為什么呢?

因?yàn)閜rint語(yǔ)句它的實(shí)現(xiàn)是將要輸出的內(nèi)容傳送了操作系統(tǒng),操作系統(tǒng)會(huì)根據(jù)系統(tǒng)的編碼對(duì)輸入的字節(jié)流進(jìn)行編碼,這就解釋了為什么utf-8格式的字符串“哈哈”,輸出的是“鍝堝搱”,因?yàn)?'\xe5\x93\x88\xe5\x93\x88'用GB2312去解釋,其顯示的出來(lái)就是“鍝堝搱”。這里再?gòu)?qiáng)調(diào)一下,str記錄的是字節(jié)數(shù)組,只是某種編碼的存儲(chǔ)格式,至于輸出到文件或是打印出來(lái)是什么格式,完全取決于其解碼的編碼將它解碼成什么樣子。

這里再對(duì)print進(jìn)行一點(diǎn)補(bǔ)充說(shuō)明:當(dāng)將一個(gè)unicode對(duì)象傳給print時(shí),在內(nèi)部會(huì)將該unicode對(duì)象進(jìn)行一次轉(zhuǎn)換,轉(zhuǎn)換成本地的默認(rèn)編碼(這僅是個(gè)人猜測(cè))

二、str和unicode對(duì)象的轉(zhuǎn)換

str和unicode對(duì)象的轉(zhuǎn)換,通過(guò)encode和decode實(shí)現(xiàn),具體使用如下:

python 中文亂碼問(wèn)題深入分析

將GBK'哈哈'轉(zhuǎn)換成unicode,然后再轉(zhuǎn)換成UTF8

三、Setdefaultencoding

python 中文亂碼問(wèn)題深入分析

如上圖的演示代碼所示:

當(dāng)把s(gbk字符串)直接編碼成utf-8的時(shí)候,將拋出異常,但是通過(guò)調(diào)用如下代碼:

import sys

reload(sys)

sys.setdefaultencoding('gbk')

后就可以轉(zhuǎn)換成功,為什么呢?在python中str和unicode在編碼和解碼過(guò)程中,如果將一個(gè)str直接編碼成另一種編碼,會(huì)先把str解碼成unicode,采用的編碼為默認(rèn)編碼,一般默認(rèn)編碼是anscii,所以在上面示例代碼中第一次轉(zhuǎn)換的時(shí)候會(huì)出錯(cuò),當(dāng)設(shè)定當(dāng)前默認(rèn)編碼為'gbk'后,就不會(huì)出錯(cuò)了。

至于reload(sys)是因?yàn)?/span>Python2.5 初始化后會(huì)刪除 sys.setdefaultencoding 這個(gè)方法,我們需要重新載入。

四、操作不同文件的編碼格式的文件

建立一個(gè)文件test.txt,文件格式用ANSI,內(nèi)容為:

abc中文

用python來(lái)讀取

# coding=gbk

print open("Test.txt").read()

結(jié)果:abc中文

把文件格式改成UTF-8:

結(jié)果:abc涓枃

顯然,這里需要解碼:

# coding=gbk

import codecs

print open("Test.txt").read().decode("utf-8")

結(jié)果:abc中文

上面的test.txt我是用Editplus來(lái)編輯的,但當(dāng)我用Windows自帶的記事本編輯并存成UTF-8格式時(shí),

運(yùn)行時(shí)報(bào)錯(cuò):

Traceback (most recent call last):

File "ChineseTest.py", line 3, in 

print open("Test.txt").read().decode("utf-8")

UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

原來(lái),某些軟件,如notepad,在保存一個(gè)以UTF-8編碼的文件時(shí),會(huì)在文件開始的地方插入三個(gè)不可見的字符(0xEF 0xBB 0xBF,即BOM)。

因此我們?cè)谧x取時(shí)需要自己去掉這些字符,python中的codecs module定義了這個(gè)常量:

# coding=gbk

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8")

結(jié)果:abc中文

五、文件的編碼格式和編碼聲明的作用

源文件的編碼格式對(duì)字符串的聲明有什么作用呢?這個(gè)問(wèn)題困擾一直困擾了我好久,現(xiàn)在終于有點(diǎn)眉目了,文件的編碼格式?jīng)Q定了在該源文件中聲明的字符串的編碼格式,例如:

str = '哈哈'

print repr(str)

a.如果文件格式為utf-8,則str的值為:'\xe5\x93\x88\xe5\x93\x88'(哈哈的utf-8編碼)

b.如果文件格式為gbk,則str的值為:'\xb9\xfe\xb9\xfe'(哈哈的gbk編碼)

在第一節(jié)已經(jīng)說(shuō)過(guò),python中的字符串,只是一個(gè)字節(jié)數(shù)組,所以當(dāng)把a(bǔ)情況的str輸出到gbk編碼的控制臺(tái)時(shí),就將顯示為亂碼:鍝堝搱;而當(dāng)把b情況下的str輸出utf-8編碼的控制臺(tái)時(shí),也將顯示亂碼的問(wèn)題,是什么也沒有,也許'\xb9\xfe\xb9\xfe'用utf-8解碼顯示,就是空白吧。>_<

說(shuō)完文件格式,現(xiàn)在來(lái)談?wù)劸幋a聲明的作用吧,每個(gè)文件在最上面的地方,都會(huì)用# coding=gbk 類似的語(yǔ)句聲明一下編碼,但是這個(gè)聲明到底有什么用呢?到止前為止,我覺得它的作用也就是三個(gè):

 

  1. 聲明源文件中將出現(xiàn)非ascii編碼,通常也就是中文;

  2. 在高級(jí)的IDE中,IDE會(huì)將你的文件格式保存成你指定編碼格式。

  3. 決定源碼中類似于u'哈'這類聲明的將‘哈'解碼成unicode所用的編碼格式,也是一個(gè)比較容易讓人迷惑的地方,看示例:

#coding:gbk

 

ss = u'哈哈'

print repr(ss)

print 'ss:%s' % ss

將這個(gè)些代碼保存成一個(gè)utf-8文本,運(yùn)行,你認(rèn)為會(huì)輸出什么呢?大家第一感覺肯定輸出的肯定是:

u'\u54c8\u54c8'

ss:哈哈

但是實(shí)際上輸出是:

u'\u935d\u581d\u6431'

ss:鍝堝搱

為什么會(huì)這樣,這時(shí)候,就是編碼聲明在作怪了,在運(yùn)行ss = u'哈哈'的時(shí)候,整個(gè)過(guò)程可以分為以下幾步:

1) 獲取'哈哈'的編碼:由文件編碼格式確定,為'\xe5\x93\x88\xe5\x93\x88'(哈哈的utf-8編碼形式)

2) 轉(zhuǎn)成 unicode編碼的時(shí)候,在這個(gè)轉(zhuǎn)換的過(guò)程中,對(duì)于'\xe5\x93\x88\xe5\x93\x88'的解碼,不是用utf-8解碼,而是用聲明編碼處指定的編碼GBK,將'\xe5\x93\x88\xe5\x93\x88'按GBK解碼,得到就是''鍝堝搱'',這三個(gè)字的unicode編碼就是u'\u935d\u581d\u6431',至止可以解釋為什么print repr(ss)輸出的是u'\u935d\u581d\u6431' 了。

好了,這里有點(diǎn)繞,我們來(lái)分析下一個(gè)示例:

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

ss = u'哈哈'

print repr(ss)

print 'ss:%s' % ss

將這個(gè)示例這次保存成GBK編碼形式,運(yùn)行結(jié)果,竟然是:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xb9 in position 0: unexpected code byte

這里為什么會(huì)有utf8解碼錯(cuò)誤呢?想想上個(gè)示例也明白了,轉(zhuǎn)換第一步,因?yàn)槲募幋a是GBK,得到的是'哈哈'編碼是GBK的編碼'\xb9\xfe\xb9\xfe',當(dāng)進(jìn)行第二步,轉(zhuǎn)換成 unicode的時(shí)候,會(huì)用UTF8對(duì)'\xb9\xfe\xb9\xfe'進(jìn)行解碼,而大家查utf-8的編碼表會(huì)發(fā)現(xiàn),utf8編碼表(關(guān)于UTF- 8解釋可參見字符編碼筆記:ASCII、UTF-8、UNICODE)中根本不存在,所以會(huì)報(bào)上述錯(cuò)誤。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美自拍小视频 | 性色av一区二区三区 | 亚洲一页 | 欧美在线观看免费观看视频 | www.狠狠干| 久久精品播放 | 国产精品2 | 一本大道久久a久久精品综合1 | 欧美一级高清免费 | 色婷婷电影 | 波多野结衣先锋影音 | 成人午夜精品一区二区三区 | 男人久久天堂 | 国产欧美日韩免费 | 自拍偷拍 欧美日韩 | 日韩中文字幕 | 国产成人精品一区二区三区视频 | 伊人精品在线 | 91中文字幕 | 好看毛片 | 久久综合久久受 | av免费人人干| 久久久久亚洲 | 日韩免费视频 | 不用播放器的毛片 | 黄色一级免费片 | 中文字幕在线观看一区二区 | 九九99| 久草视频网站 | 亚洲视频免费观看 | 蜜桃国精产品二三三区视频 | 中日韩黄色大片 | 亚洲一区自拍偷拍 | 日韩aaa视频 | av午夜电影| 亚洲视频在线免费观看 | 亚洲成人av一区二区三区 | 欧洲一级毛片 | 午夜av在线 | 国产亚洲欧美美 | 久久久久国产一区二区三区 |