正則表達式 中文字符 編碼,字符編碼在python中的處理_python 字符編碼處理問題總結

 2023-10-15 阅读 13 评论 0

摘要:Python中常常遇到這種字符編碼問題,尤其在處理網頁源代碼時(特別是爬蟲中): UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 12-15: illegal multibyte... 正則表達式 中文字符 編碼。以下以漢字'哈'來解釋作

Python中常常遇到這種字符編碼問題,尤其在處理網頁源代碼時(特別是爬蟲中):

UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 12-15: illegal multibyte...

正則表達式 中文字符 編碼。以下以漢字'哈'來解釋作演示樣例解釋全部的問題,漢字“哈”的各種編碼例如以下:

1 UNICODE(UTF8-16): 0xC854

2 UTF-8: 0xE59388

python3編碼、3 GBK: 0xB9FE

除此之外還有如gb2312, big5等。比如一些含有繁體字的頁面。比方www.google.com.hk首頁中用的就是big5碼,

不知道港臺的碼農同一時候處理簡體字繁體字是不是更郁悶 :)

python代碼編碼成jni,一直以來。python中的中文編碼就是一個大問題,為他他并不能智能識別編碼,而實際上其它語言也非常難做到。

在html的header里一般都能夠找到字符編碼比如:

python編碼聲明,當然這不是我們研究的重點,很多其它的時候是我們得知一個字符串是GBK編碼, 而要用print等正確的打印出來卻不easy...

首先,在python中提到unicode。一般指的是unicode對象,比如'哈哈'的unicode對象為u'\u54c8\u54c8'

而str是一個字節數組。這個字節數組表示的是對unicode對象編碼后(如utf-8、gbk、cp936、GB2312)的存儲的格式,這里它

python字符型?僅是一個字節流。沒有其他的含義,假設你想使這個字節流顯示的內容有意義,就必須用正確的編碼格式,解碼顯示。

比如:(注意是在windows下)

s = u'哈哈'

s_utf8 = s.encode('utf-8')

pirnt s_utf8

>>> 鍝堝搱

悲劇...

s_utf8這時實際上是'\xe5\x93\x88\xe5\x93\x88'

而以下的代碼才干夠正常顯示:

s_gdb = s.encode('gbk') # s_gdk 這時是'\xb9\xfe\xb9\xfe'

print s_gbk

>>> 哈哈 #正常了

由于print語句它的實現是將要輸出的內容傳 送了操作系統,操作系統會依據系統的編碼對輸入的字節流進行編碼。這就解釋了

utf-8格式的字符串“哈哈”,輸出的是“鍝堝搱”,由于 '\xe5\x93\x88\xe5\x93\x88'用GB2312去解釋,其顯示的出來就

“鍝堝搱”。

這里再強調一下,str記錄的是字節數組,僅僅是某種編碼的存儲格式,至于輸出到文件或是打印出來是什么格式。

全然取決其解碼的編碼將它解碼成什么樣子。

這里再對print進行一點補充說明:當將一個unicode對象傳給print時,在內部會將該unicode對象進行一次轉換,

轉換成本地默認編碼(這僅是個人推測)

str和unicode對象的轉換,通過encode和decode實現,詳細使用例如以下:再次強調windows下:

s = '哈哈'

print s.decode('gbk').encode('utf-8')

>>> 鍝堝搱

反之亦然,有興趣能夠嘗試其它轉換

有時當我們遇到把s(gbk字符串)直接編碼成utf-8的時候。將拋出異常,可是通過調用例如以下代碼:

import sys

reload(sys)

sys.setdefaultencoding('gbk')

后就能夠轉換成功。為什么呢?

在python中str和unicode在編碼和解碼過程中。假設將一個str直接編碼成還有一種編碼,會先把str解碼成unicode,

採用默認編碼,一般默認編碼是anscii,所以在上面演示樣例代碼中第一次轉換的時候會出錯。

當設定當前默認編碼為'gbk'后,就不會出錯了。

至于reload(sys)是由于Python2.5 初始化后會刪除 sys.setdefaultencoding 這種方法。我們須要又一次加載。

一般不推薦這樣使用。本來reload都是應該避免使用的函數。

對于操作不同文件的編碼格式的文件,也會遇到這種問題

建立一個文件test.txt,文件格式用ANSI,內容為:

abc中文

然后用python來讀取

# coding=gbk

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

結果:abc中文

把文件格式改成UTF-8:

結果:abc涓枃,顯然。這里須要解碼:

# coding=gbk

import codecs

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

結果:abc中文

上面的test.txt我是用Editplus來編輯的。但當我用Windows自帶的記事本編輯并存成UTF-8格式時,

執行時報錯:

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

原來,某些軟件,如notepad。在保存一個以UTF-8編碼的文件時,

會在文件開始的地方插入三個不可見的字符(0xEF 0xBB 0xBF,即BOM)。

因此我們在讀取時須要自己去掉這些字符。python中的codecs module定義了這個常量:

# coding=gbk

import codecs

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

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

data = data[3:]

print data.decode("utf-8")

結果:abc中文

最后,有些時候編碼搞對了,可是遇到了非法字符。比方產生字符串的來源錯誤發生。引入了錯誤值等,這時再次遇到異常

比如:全角空格往往有多種不同的實現方式。比方\xa3\xa0,或者\xa4\x57,

這些字符。看起來都是全角空格。但它們并非“合法”的全角空格

真正的全角空格是\xa1\xa1,因此在轉碼的過程中出現了異常。

而之前在處理新浪微博數據時。遇到了非法空格問題導致無法正確解析數據。

解決的方法:

將獲取的字符串strTxt做decode時。指明ignore。會忽略非法字符,

當然對于gbk等編碼,處理相同問題的方法是類似的

strTest = strTxt.decode('utf-8', 'ignore')

return strTest

默認的參數就是strict,代表遇到非法字符時拋出異常;

假設設置為ignore。則會忽略非法字符;

假設設置為replace。則會用?

號代替非法字符;

假設設置為xmlcharrefreplace,則使用XML的字符引用。

其它的以后遇到再總結.....

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/138258.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息