日常 如何處理「火星文」亂碼

2021-09-29 21:00:46 字數 2535 閱讀 2662

爬蟲中常常會遇到兩種亂碼,一種是中遇到的亂碼,嚴格來說這不是亂碼,這是字元編碼後的結果,而且它根本不亂,只是我們看不懂而已,但是計算機是可以輕易讀懂它是什麼意思的。

第二種便是如下圖所示的情況了?

¡¾éﺣõð渣¬çóö°¡¿-ç°³ìîþóç
▽奻漆桸ごㄛ⑴眥▼-ヶ最拸蚡
這些亂碼是最近筆者在為老師爬取某就業資訊**時遇到的問題。其實之前也遇到過類似的亂碼問題,乙個字元用同一種編碼方式編碼解碼當然會得到該字元本身,而這種亂碼之所以會出現,其本質是字元使用了一種編碼方式進行編碼,然後卻用另一種編碼方式去解碼,所以最終得到了一堆亂七八糟的串。

通常在爬蟲**現這種問題是因為許多網頁的編碼方式是iso-8859-1,而計算機通用的編碼方式是utf-8與gbk,爬蟲獲取資料時獲取到的是資料編碼後的串,而最終我們看到的又是計算機為我們解碼後的結果,所以會出現這些「火星文」,通常來說只需要把這幾種常用的編碼方式兩兩搭配去對這些「火星文」編碼解碼試試,看看哪一種會出正確的結果差不多就可以了。

這種方法相對來說比較憑據經驗,做得多了有時候可以看出這些「火星文」大致是哪組編譯碼出的問題,至少上面兩種情況的「火星文」顯然是不同風格的「火星文」,自然也是不同組的編譯碼出的問題。凡事都有例外,這次我確實沒能試出究竟是哪兩種編碼出的問題。

為了方便以後快速找到哪兩種編碼方式,筆者編寫了以下方法供參考?

# -*- coding=utf-8 -*-

import os

""" 平台:csdn

創作不易,僅供分享

"""class mycode():

def __init__(self,

pypath="e:/python",

codes=none,

): self.pypath = pypath.replace("\\","/")

self.pypath = self.pypath[:-1] if self.pypath[-1]=="/" else self.pypath

if codes: self.codes = codes # 使用者指定編碼列表則使用自定義編碼方式列表

else: # 否則從python根目錄下讀取所有編碼方式

self.codes =

for filename in os.listdir("{}/lib/encodings".format(self.pypath)):

code = filename.split(".")[0]

try: a = "1".encode(code)

except: continue

def transform(self,string,log=false,logpath="c:/users/lenovo/desktop"):

logpath = logpath.replace("\\","/")

logpath = logpath[:-1] if logpath[-1]=="/" else logpath

for x in self.codes:

for y in self.codes:

try: temp = string.encode(x).decode(y)

except: continue

result = "encode:{}\tdecode:{}\tresult:\t{}".format(x,y,temp)

print(result)

if log:

with open("{}/mycode_log.txt","a") as f:

f.write("{}\n".format(result))

if __name__ == "__main__":

mycode = mycode()

mycode.transform("¡¾éﺣõð渣¬çóö°¡¿-ç°³ìîþóç")

注意到,python的根目錄下的lib資料夾中的encodings資料夾中存了一百多種編碼方式的py檔案,如筆者的python根目錄在e:/python/,則該資料夾在e:/python/lib/encodings/?

這些檔案的檔名恰為編碼的名稱,筆者試圖遍歷所有的「編碼方式對」去找到正確的處理方式,上面**執行結果如下?

可以看到使用charmap編碼,gb18030/gb2312/gbk解碼即可使得這串「火星文」變成能夠讀懂的漢字。

當然這種「編碼方式對」未必唯一,有人說一百多種編碼方式對得有一萬多種情況,這該怎麼找呢?

筆者推薦視力好的直接翻了找,視力差的去配副好點的眼鏡,如果瞎了的話就列個常用字元庫(中英文都要有,但一般來說出現火星文都是中文的問題),多寫點**大致判斷一下上圖result後的字串是正常字串的概率是多少,做個預篩選,然後再摸索。

分享學習,共同進步!

如何處理SecureFX中的中文亂碼

分享給大家,也當作給自己記錄下來。首先,在securefx選單中選擇 options global options 然後,在 global options 視窗中,選擇 general configuration path 找到securefx配置檔案所在的路徑,並複製該路徑 接著,在電腦中開啟這個...

如何處理SecureFX中的中文亂碼

情況描述 今天在使用securefx連線伺服器進行資料傳輸時,發現包含中文名稱的檔案在securefx中無法正常顯示,出現的都是亂碼。解決方法 1 開啟securefx,找到含有中文名的路徑,檢視還有中文名的檔案 2 在securefx選單中選擇 options 選項 global options ...

java如何處理linux名字亂碼批量重新命名問題

對於一般批量檔案重新命名處理 第一種 public static void main string args throws ioexception else 但是上述方法在檔名亂碼的情況下就失效了,所以需要下面的方法 在linux底下,檔案都有乙個對應的索引的,可以通過ls i inums.txt,...