小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

(ok)Python3編碼解碼問題匯總

 hdzgx 2020-01-08

一、解碼問題: ‘utf-8’ codec can’t decode byte 0xa8 in position xx: invalid start byte

【問題描述】:

筆者通過Python3從數(shù)據(jù)庫(HBase)中取數(shù)據(jù)的時候,報錯如下:
在這里插入圖片描述
報錯信息顯示,在內(nèi)置函數(shù)轉(zhuǎn)換獲取的數(shù)據(jù)(字節(jié)數(shù)組)為字符串str時,UTF-8編碼方案無法對字節(jié)\xa8進(jìn)行解碼,該字節(jié)0xa8在當(dāng)前字節(jié)數(shù)組的索引是21(從0開始計數(shù))。

【問題分析】:

在解決這個問題之前,我們首先來回顧一下Python3中編碼解碼之間的轉(zhuǎn)換關(guān)系如下(欲全面了解編碼和解碼問題詳情點擊此處):
在這里插入圖片描述
可見,當(dāng)數(shù)據(jù)含有中文其他特殊字符時,Unicode碼被編碼成非UTF-8和非ASCII碼(如GBK碼)后,再用UTF-8解碼就會出錯。因為,它們根本就不是一套編碼方案。

本例中,我無法解碼的數(shù)據(jù)在本地的顯示是:

Ecole Polytechnique Fédérale de Lausanne (EPFL)

在數(shù)據(jù)庫中的顯示是:
在這里插入圖片描述
我們都知道Python中,UTF-8碼會將Unicode碼中的每個非ASCII字符編碼成2~3個字節(jié)(中文是3個字節(jié),這里的é是兩個字節(jié)),格式是\x##。

所以,我們可以推斷出,在數(shù)據(jù)被傳輸或存儲前,Unicode碼所表示的str,被轉(zhuǎn)換成了非UTF-8編碼。這自然在編輯或獲取數(shù)據(jù)時,無法用UTF-8碼解碼成Unicode,上例中的第一個非ASCII字節(jié)\xA8即為報錯信息索引為21中的0xa8。

至此,我們完全理解了為什么會出錯,和具體在哪個位置出的錯

【解決思路】:
  1. 在str數(shù)據(jù)被傳輸或存儲前,保證其為Unicode碼,再對其進(jìn)行UTF-8編碼(.encode('utf-8'))。
  2. 在str數(shù)據(jù)被編輯或獲取前,對其進(jìn)行UTF-8解碼(.decode('utf-8'))為Unicode碼。
  3. 對于需要和數(shù)據(jù)庫交互的情況,往往譬如insert()get()等方法都會內(nèi)置字符串str字節(jié)數(shù)組bytes之間的轉(zhuǎn)換函數(shù),為防止其不被轉(zhuǎn)換成GBK等其他編碼,所以只要在傳入數(shù)據(jù)前保證其為Unicode碼即可。
本例中我的解決方案:

保證上傳的字段valueUnicode碼,即成功。

def function(...,value=str(value).encode('utf-8').decode('utf-8'),...)

utf-8編碼后的數(shù)據(jù)在數(shù)據(jù)庫中的顯示,該字節(jié)可被utf-8解碼為Unicode碼:
在這里插入圖片描述

二、編碼問題:‘gbk’ codec can’t encode character ‘\uxxxx’ in position xxxxx: illegal multibyte sequence

【問題描述】:筆者在Windows系統(tǒng)下嘗試將數(shù)據(jù)庫中數(shù)據(jù)讀取出來,并寫入到本地.txt文件中報錯。

報錯代碼如下:

    with open('C:\\Users\\Administrator\\xxx\\content.txt', 'w') as f:
        f.write(str_data)

讀取亦然:

    with open('C:\\Users\\Administrator\\xxx\\content.txt', 'r') as f:
        str_data = f.read()

意思是在索引為26088的'\u0141'Unicode碼表示的字節(jié)無法被GBK編碼方案編碼。在這里插入圖片描述
在這里插入圖片描述

【問題分析】:

Windows系統(tǒng)默認(rèn)是GBK編碼,所以在單獨設(shè)置編碼方案的時候,系統(tǒng)會自動默認(rèn)為GBK編碼,對于含有非中文的字符就無法編碼。

【解決方案】:

不論數(shù)據(jù)中是否含有中文等非ASCII字符,直接編碼成UTF-8即可。

    with open('C:\\Users\\Administrator\\xxx\\content.txt', 'w', encoding='utf-8') as f:
        f.write(str_data)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多