一次性解決你所有的編碼檢測問題

2021-09-02 22:30:21 字數 2041 閱讀 1316

在日常使用中,我們難以避免會遇到編碼轉換問題。(如果編碼是什麼都不知道,請先看:什麼是編碼?)

而進行編碼轉換的前提是你知道這個字串使用的是什麼編碼。

比如你使用 urllib.request.urlopen() 獲取乙個網頁時,你特麼如果不知道網頁的編碼會怎樣?

直接 read().decode() 就可能會出現下邊錯誤:

這是因為無論是 encode() 還是 decode(),預設採取的編碼/解碼都是 encoding="utf-8" 編碼……

雖然你大 utf-8 行跡踏遍天下,但在這神州大地,處處都有奇葩的好不?

這時候需要乙個可靠的方式來檢測字串到底是什麼編碼,這樣我們才能對症下藥!

這裡我向大家推薦乙個不錯的模組:chardet,使用它就可以檢測字串的編碼。

chardet 模組可以檢測以下編碼:

chardet 模組安裝方法:

1. (推薦)使用 pip 安裝,開啟命令列視窗(windows 的 cmd,linux 的 terminal,mac 的「終端」)

輸入命令:pip install chardet

開啟命令列視窗(同上),切換目錄到上方解壓包的資料夾,輸入命令:c:\python34\python.exe setup.py install

chardet 模組用法:

非常簡單,使用該模組的 detect() 函式即可:

>>> import urllib.request

>>> response = urllib.request.urlopen("").read()

>>> import chardet

>>> chardet.detect(response)

哦,confidence 是可信度的意思……

0.99 就是 99% 確定是 'gb2312'!

年輕人,你太傲嬌了,偶其實使用的是 gbk 編碼(gbk 是 gb2312 的擴充套件)

所以你直接 decode('gb2312') 還是會報錯的:(是不是很炸裂)

>>> response.decode("gb2312")

traceback (most recent call last):

file "", line 1, in response.decode("gb2312")

unicodedecodeerror: 'gb2312' codec can't decode byte 0xfd in position 22581: illegal multibyte sequence

你現在有兩種選擇:

一、忽略識別不出的字元(gb2312 支援的漢字比較少,如果用這種方法會出現小部分亂碼)

>>> response.decode("gb2312", "ignore")

……# 賈伯斯最精彩演講:這三個故事決定了我的一

# 42個鍛鍊大腦的方法,你想不聰明都不行!

# 潘靠賜輳淚流滿面**)

……

二、(推薦)由於 gbk 是向下相容 gb2312,因此你檢測到是 gb2312,則直接用 gbk 來編碼/解碼

>>> if chardet.detect(response)['encoding'] == 'gb2312':

response.decode('gbk')

……# 賈伯斯最精彩演講:這三個故事決定了我的一

# 42個鍛鍊大腦的方法,你想不聰明都不行!

# 屌絲看完,淚流滿面**)

……

一次性關閉所有的activity

看到很多關於應用退出的問題,今天在這裡為大家簡單總結一下,如果說的不對還望大家見諒。方法一 system.exit 0 和android.os.process.killprocess android.os.process.mypid 我想很多人都嘗試過,當關 閉多個activity的時候這兩個方法根...

一次性備份SQL Server中所有的資料

備份處理的儲存過程 set ansi nulls on set quoted identifier on go 備份所有資料庫 備份的檔名為資料庫名 日期 bak 將所有的使用者資料庫 或指定的資料庫列表 備分到指定的目錄下.呼叫示例 備份所有使用者資料庫 exec p backupdb bkpat...

一次性退出所有activity

可以利用清理歷史棧的方法,來巧妙關閉所有activity,首先用乙個設定為不可見的activity a來啟動程式,這個activity a的作用只是用來墊棧底,只有啟動和退出程式才會用到這個activity,而你需要退出的時候,只需要跳轉至這個activity a 並讓a finish自己就可以實現...