由于公眾號推送機制改變,歡迎在公眾號首頁點擊右上【···】,將東哥在灣區設為?“星標”?,及時接收文章推送。
大家好,我是東哥,你身邊放心的香港保險顧問。
這是我的第708篇原創。
上篇文章,我們分享了
作為C端業務,繳費操作都已經是傻瓜化操作。
手機上點兩下就可以完成繳費。
體驗絲滑。
但前提,是你得有一個香港銀行賬戶。
對香港銀行賬戶感興趣的朋友,歡迎微信上聯系東哥。
東哥最近,化身碼農。
像俺自己寫的保單管理系統,已經上千行代碼了。
而且已經開始同步開發了一些小工具供公司內大伙使用。
就很爽。
東哥年輕的時候,瘋狂的喜歡編程,沉迷代碼的世界不可自拔。
還琢磨過轉行去做程序員。
誰知道許多年后,居然曲線救國,從另一個角度成功了。
也是神奇。
給別人開發和寫給自己用,考慮的方面就不一樣。
在處理數據第一步,就卡殼了。
怎么回事兒?
1
文件編碼。
東哥自己的文件,都是用utf8編碼。
誰用誰知道,那叫一個爽。
所以在編程的時候,根本不需要考慮這個問題。
但現在開始處理別人的文件,問題就來了。
傳遞過來的文件,尤其一些工具軟件導出的,編碼就千奇百怪。
傳統上,靠人工推測,估摸著可能是什么編碼,然后一個個嘗試。
但這樣效率也未免太低了。
摸索了半天,最后的結果卻非常簡單。
Python讀取文本文件的編碼,有什么好的辦法?
2
國內的編碼,主要有三個,GB2312、GBK和GB18030。
其中GB2312最為古老,發布時間于1980年。
它是中國大陸早期的簡體中文國家標準,標準編號GB 2312-1980。
涵蓋了 6763個漢字,并支持 682個非漢字字符(如標點、拉丁字母、日文假名等)。
由于比較古老,所以涵蓋面也不足。
如果文本包含超出范圍的字符,會拋出 UnicodeDecodeError。
現代應用中,大家已經不太常用這個編碼了。
有一些舊系統可能仍有殘留。
3
第二個,GBK。
GBK發布于1995年,是GB2312 的擴展。
字符范圍從上一代的6763個漢字,擴展到了 21886個漢字。
不僅覆蓋了 GB2312 全部字符,還新增繁體字、生僻字及符號。
還支持中日韓統一表意文字(CJK Unified Ideographs) 的擴展部分。
這個編碼最大的好處是兼容 GB2312,即所有 GB2312 編碼的字符在 GBK 中保持不變。
保證了向后兼容。
一直是Windows 簡體中文版的默認編碼,直到 Windows 10。
4
第三個,GB18030。
這個編碼發布于 2000年,最新版為 GB18030-2022。
這個編碼是中國國家強制標準,覆蓋所有 Unicode 字符。
包括簡體、繁體、少數民族文字、Emoji 等。
一共包含 87887個漢字,遠超過 GBK的2萬個。
而且它在設計上,完全兼容 GB2312 和 GBK,可無縫替代舊編碼。
中國大陸銷售的軟件產品必須支持 GB18030。
5
到這兒,就很簡單了。
對于國內軟件,可以優先嘗試GB18030。
無論是GB2312還是GBK,它都能讀取。
那是不是直接選用GB18030就可以了?
不行。
還記沒記得,東哥自己一直用的是UTF8。
什么是UTF8?
UTF8(Unicode Transformation Format-8)是國際標準,是Unicode字符集的實現方式之一,由國際組織Unicode Consortium維護。
它的設計目標是解決全球多語言文本的統一編碼問題。
作為國際標準,它在多語言支持、國際化應用或開源項目中應用更為廣泛。
東哥雖然沒有多語言支持的需求,但為了俺的國際范兒,一直用的是UTF8。
而且市面上很多文件也是以UTF8編碼的。
所以我們還得考慮UTF8的編碼。
6
涉及到UTF8的話,就天然的存在一個問題,BOM。
具體啥是BOM,咱這里不細述了,微軟早先年搞出來的東東。
算是業界的一朵奇葩。
所以現在同樣UTF8編碼的文件,有的有BOM,比如用Windows記事本保存的;
有的沒有BOM,比如Web或Mac系統的生成的。
讀取的時候,就需要再次判斷,就很麻煩。
怎么辦?
Python已經考慮了這個問題,讀入的時候,可以考慮無腦用有BOM的方式讀取。
如果開頭有BOM,它就略過BOM,讀入后面的實際內容;
如果開頭沒有BOM,它就正常讀入內容。
不需要我們人工再次判斷。
7
所以現在,我們有了兩個選擇,GB18030和帶BOM的UTF8。
這兩個基本涵蓋了日常99%的應用。
具體實現上,可以用一個異常來嘗試。
def openr(fpath=None) -> str:
''' open file to read with utf8 or fallback encodings. '''
# 嘗試多種編碼,避免報錯和亂碼
encodings = ["utf-8-sig", "gb18030"]
for enc in encodings:
try:
ifile = open(fpath, mode='r', encoding=enc)
return ifile
except UnicodeDecodeError:
continue
raise ValueError("無法解碼文件,請檢查編碼")
還有沒有其他情況需要考慮?
有。
比如有些文件,既不是UTF8,又不是GB18030的情況。
這時候可以考慮用專門的編碼檢測工具chardet
pip install chardet
但以上內容,足以覆蓋東哥日常,就不在拓展啦。
人生苦短,我用Python。
對酒當歌,我用Python。
這是屬于理工男的浪漫。
愛生活,愛拉芳,Python天天見。
能看懂這個梗的,是不是都有點年紀了
關注東哥,保護中產財富,一起慢慢變富。
東哥目前提供如下服務,有需要的朋友歡迎微信來撩。
,一個經營強鏈接的社群。
群里有老板、投資人、500強高管、律師、HR……
討論個人IP打造、中年人第二曲線、碩博學歷提升、企業出海項目等。
,分享一些專業金融知識及硬核資訊;
討論香港保險、香港銀行開戶、美股投資、比特幣投資、房產投資等。
,1-2小時的深度交流。
涵蓋自媒體指導、職業規劃、就業指導、IP打造、個人優勢挖掘、銷售獲客技巧、資源鏈接等。
人是萬物的尺度。找一群人一起走,一起慢慢變富。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.