當前位置:首頁 » 編程語言 » python編碼與解碼

python編碼與解碼

發布時間: 2023-09-07 20:15:26

python 編碼轉換與中文處理

python 中的 unicode 是讓人很困惑、比較難以理解的問題. 這篇文章 寫的比較好, utf-8是 unicode的一種實現方式,unicode、gbk、gb2312是編碼字元集.

Python 默認腳本文件都是 ANSCII 編碼的,當文件 中有非 ANSCII 編碼范圍內的字元的時候就要使用" 編碼指示 "來修正一個 mole 的定義中,如果.py文件中包含中文字元(嚴格的說是含有非anscii字元),則需要在第一行或第二行指定編碼聲明: # -*- coding=utf-8 -*- 或者 #coding=utf-8
其他的編碼如:gbk、gb2312也可以;否則會出現:

先說一下python中的字元串類型,在python中有兩種字元串類型,分別是 str 和 unicode ,他們都是basestring的派生類;

在str的文檔中有這樣的一句話:

也就是說在讀取一個文件的內容,或者從網路上讀取到內容時,保持的對象為str類型;如果想把一個str轉換成特定編碼類型,需要把str轉為Unicode,然後從unicode轉為特定的編碼類型如:utf-8、gb2312等。

unicode 轉為 gb2312,utf-8等,使用 encode(encoding)

utf-8,GBK轉換為 unicode 使用 unicode(s,encoding) 或者 s.decode(encoding)

普通的 str 轉為 unicode,

如果直接執行s.encode('gb2312')會發生什麼?

這里會發生一個異常:Python 會自動的先將 s 解碼為 unicode ,然後再編碼成 gb2312。因為解碼是python自動進行的,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding 是 ANSCII,如果 s 不是這個類型就會出錯。
拿上面的情況來說,我的 sys.defaultencoding 是 anscii,而 s 的編碼方式和文件的編碼方式一致,是 utf8 的,所以出錯了:

對於這種情況,我們有兩種方法來改正錯誤:

s = '中文'
s.decode('utf-8').encode('gb2312') ```

import sys
reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入
sys.setdefaultencoding('utf-8')
str = '中文'
str.encode('gb2312')

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

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

Traceback (most recent call last):
File "ChineseTest.py", line 3, in <mole>
print open("Test.txt").read().decode("utf-8")
UnicodeEncodeError: 'gbk' codec can't encode character u'ufeff' in position 0: illegal multibyte sequence

import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")

s = "中文"
print unicode(s, "utf-8")

Traceback (most recent call last):
File "ChineseTest.py", line 3, in <mole>
s = unicode(s, "utf-8")
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data

s = "中文"
print unicode(s, "gbk")

s = "中文"
print unicode(s, "cp936")

⑵ Python怎麼能簡單實現Base64編碼和解碼

Base64編碼是一種「防君子不防小人」的編碼方式。廣泛應用於MIME協議,作為電子郵件的傳輸編碼,生成的編碼可逆,後一兩位可能有「=」,生成的編碼都是ascii字元。
優點:速度快,ascii字元,肉眼不可理解
缺點:編碼比較長,非常容易被破解,僅適用於加密非關鍵信息的場合
Python Base64編碼和解碼示例:
>>> import base64
>>> s = '我是字元串'
>>> a = base64.b64encode(s)
>>> print a
ztLKx9fWt/u0rg==
>>> print base64.b64decode(a)
我是字元串

⑶ Python 讀寫文件的編碼與解碼問題

演示文件為docx文檔,內容如下:

源碼

運行源碼查看報錯信息
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 15: illegal multibyte sequence

上述錯誤是一種很常見的解碼錯誤,下面介紹該錯誤的解決方法

把utf-8,gbk等各種編碼方式都試了一遍,還是沒有解決問題然後仔細看報錯信息,根據UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfb in position 14: invalid start byte,猜測文件中某個位元組不能解碼,打開文件一看,並沒有看出什麼問題來

open() 函數的第三個參數不是用來野唯接收編碼方式的,而磨脊信是傳入一個buffering的值,此處傳入了'gbk'字元串,所以系統提示傳一個瞎輪整型


通過調用office的API進行操作,因為在office上能完成的操作,都能通過win32完成,所以我們選擇使用win32
(Python3.5 需要安裝 win32compat,裡面含了 win32 的很多包)

⑷ ASN.1語法以及在python中如何編碼解碼



ASN.1的文章本來是免費的,但是有的人一定要搞小動作,咱惹不起就只能躲著了,做了一些修改後,改為付費文章



應用程序在網路協議的應用層對payload數據,多使用ASN.1標准進行處理

ASN.1

ASN.1



Abstract Syntax Notation One,抽象語法標記,ASN.1是描述數據格式的標准方法, 它不管語言是如何執行、這些數據具體指什麼、用什麼類型的編碼規則 ,是一種抽象的語法



ASN.1由兩部分組成:

一部分描述信息內數據,數據類型及序列格式

另一部分描述如何將各部分組成消息

語法

例如

Report ::= SEQUENCE {

author OCTET STRING,

title OCTET STRING,

body OCTET STRING,

biblio Bibliography



Report是結構體名稱

SEQUENCE表示消息是由許多數據單元構成的

中括弧{}裡面是各種類型的數據單元

前三個數據單元author/title/body的類型是OCTET STRING

最後一個數據單元biblio的類型是另一個ASN.1結構體

Bibliography ::= SEQUENCE {

author OCTET STRING

title OCTET STRING

publisher OCTET STRING

year OCTET STRING



數據類型

類型含義

NULL空

BOOLEAN布爾類型

INTEGER整型

REAL實數類型

BIT STRING比特串

OCTEC STRING位元組串

OBJECT IDENTIFIER實體標識符

ENUMERATED枚舉類型

SEQUENCE序列

SEQUENCE OF類型的序列

SET集合

SET OF類型的集合

CHOICECHOICE類型

...STRING(有很多就不一一列舉)字元串類型

UTCTime時間類型

GeneralizedTime時間類型

ASN.1文件結構

例如

Foo DEFINITIONS ::= BEGIN

    Question ::= SEQUENCE {

        id        INTEGER,

        question  IA5String

    }

    Answer ::= SEQUENCE {

        id        INTEGER,

        answer    BOOLEAN

    }

END 

解析上面的ASN.1文件的結構

ASN.1支持的編碼規則

基本編碼規則(BER)

規范編碼規則(CER)

識別名編碼規則(DER)

壓縮編碼規則(PER)

XML編碼規則(XER)

python如何對ASN.1結構的信息編碼和解碼

如果我們想用python對信息進行編碼,需要明確幾點:

提供的ASN.1格式的數據

更多內容,請參考公-中-號, 汽車網路診斷通信

⑸ python str與bytes編碼解碼

下面一張圖搞懂編碼、解碼、編碼表之間的關系。

不難看出,它們是一種根據編碼表進行翻譯、映射的過程:

實際上,字元串類型只有encode()方法,沒有decode()方法,而bytes類型只有decode()方法而沒有encode()方法。

二進制格式的數據也常稱為裸數據(raw data),所以str數據經過編碼後得到raw data,raw data解碼後得到的str。

上面說了,編碼是將字元數據轉換成位元組數據(raw data),解碼是將位元組數據轉換成字元數據。在Python中字元數據也就是字元串,即str類型,位元組數據也就是bytes類型或bytearray類型。

編碼時,可以使用位元組類型的構造方法bytes()、bytearray()來構造位元組,也可以使用str類型的encode()方法來轉換。

解碼時,可以使用str類型的構造方法str()來構造字元串,也可以使用bytes、bytearray()類型的decode()方法。

另外需要注意的是,編碼和解碼的過程中都需要指定編碼表(字元集),默認採用的是utf-8字元集。

例如,使用encode()的方式將str編碼為bytes數據。

使用bytes()和bytearray()將str構造成bytes或bytearray數據,這兩個方法都要求str->byte的過程中給定編碼。

實際上,bytes()、bytearray()這兩個方法構造位元組數據的時候還有點復雜,因為可以從多個數據源來構造,比如字元串、整數值、buffer。如何使用這兩個方法構造位元組數據,詳細內容參考help(bytes)和help(bytearray)給出的說明,這里給幾個簡單示例。

構造bytes的方式:

構造bytearray的方式:

解碼是位元組序列到str類型的轉換。

例如,使用decode()方法進行解碼"我"字,它的utf-8的編碼對應為"\xe6\x88\x91":

使用str()進行轉換。

當編碼、解碼的過程使用了不同的(不兼容的)編碼表時,就會出現亂碼。所以,解決亂碼的唯一方式是指定對應的編碼表進行編碼、解碼。

例如,使用utf-8編碼"我"字,得到一個bytes序列,然後使用gbk解碼這個bytes序列。

這里報錯了,因為utf-8的位元組序列里有gbk無法解碼的位元組。如果使用文本編輯器一樣的工具去顯化這個過程,得到的將是亂碼字元。

原文地址: https://www.cnblogs.com/f-ck-need-u/p/10185965.html

⑹ Python編碼字元串解碼問題,怎麼解決

在將字元串寫入文件時,執行f.write(str),後台總是報錯:UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 0: ordinal not in range(128),即ascii碼無法被轉換成unicode碼。
剛開始我以為Python默認的編碼是utf-8,所以使用decode方法和encode方法來進行編碼轉換,後來怎麼也不成功,於是懷疑是否默認編碼不是utf-8。
使用下面語句獲取python當前的默認編碼:
[python] view plain
import sys
print sys.getdefaultencoding()

⑺ Python3 如何對url解碼

url編碼:

import urllib

url = 'http://test.com/s?wd=哈哈' #如果塵鉛早此網站編碼是激蠢gbk的話派雀,需要進行解碼,從gbk解碼成unicode,再從Unicode編碼編碼為utf-8格式。

url = url.decode('gbk', 'replace')

print urllib.quote(url.encode('utf-8', 'replace'))

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:432
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:236
java駝峰 發布:2025-02-02 09:13:26 瀏覽:652
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726