Python 升級到3.0之后,已經很少會有亂碼的情形,尤其在源碼中注解:
# -*- coding: utf-8 -*-
但是如果我們讀入的內容本來就是亂碼的該如何是好?
舉例:
- 從操作系統讀取文件清單。在文件夾中查看,該文件名本來就是亂碼。 (已知這個文件是繁體BIG5編碼,所以在簡體系統中顯示是亂碼)
- 以下是讀取文件名的代碼:
# coding: Utf-8 import os files = os.listdir('c:\\temp') print(files[9:10]) # 僅顯示亂碼的文件名 str1 = files[9] print(str1.encode('utf-8'))
注意“畗”這個,對應的UTF-8的編碼是\xe7\x95\x97,轉換為unicode之后:\u7557
- 通過下面網站查看對應的字符編碼
https://www.qqxiuzi.cn/bianma/zifuji.php
- 繼續在網站中查 AE7D對應的BIG5
- 可以理解如下:
徐 -(Big5 編碼)-> AE7D -(GBK 解碼)-> 畗 -(UTF-8/Unicode 編碼)-> \xe7\x95\x97/\u7557(畗)
所以出現問題的環節還是在紅字加粗的部分。
- 修復亂碼
# coding: Utf-8 import os files = os.listdir('c:\\temp') print(files[9:10]) # 僅顯示亂碼的文件 str1 = files[9] print(str1.encode('utf-8')) print(str1.encode('GBK').decode('Big5'))
- 整個流程解釋如下:
徐 -(Big5 編碼)-> AE7D -(GBK 解碼)-> 畗 -(UTF-8/Unicode 編碼)-> \xe7\x95\x97/\u7557 -(UTF-8/Unicode 解碼)-> 畗 -(GBK 編碼)-> AE7D -(Big5 解碼)-> 徐
紅色字部分:之前在操作系統層面操作導致出問題
橙色字部分:Python3讀取系統文件清單時候的默認操作
綠色字部分:Python3內部默認操作
黑色粗體部分:亂碼矯正
附參考文檔:
https://www.qqxiuzi.cn/bianma/zifuji.php
https://tool.oschina.net/hexconvert/
https://zhuanlan.zhihu.com/p/26261762
http://cenalulu.github.io/linux/character-encoding/