Python 升级到3.0之后,已经很少会有乱码的情形,尤其在源码中注解:

# -*- coding: utf-8 -*-

但是如果我们读入的内容本来就是乱码的该如何是好?

举例:

  • 从操作系统读取文件清单。在文件夹中查看,该文件名本来就是乱码。 (已知这个文件是繁体BIG5编码,所以在简体系统中显示是乱码)

python raw input乱码 python3 乱码_ico

  • 以下是读取文件名的代码:
# coding: Utf-8
import os

files = os.listdir('c:\\temp')
print(files[9:10])  # 仅显示乱码的文件名
str1 = files[9]
print(str1.encode('utf-8'))

python raw input乱码 python3 乱码_python raw input乱码_02

  注意“”这个,对应的UTF-8的编码是\xe7\x95\x97,转换为unicode之后:\u7557

  • 通过下面网站查看对应的字符编码

https://www.qqxiuzi.cn/bianma/zifuji.php 

python raw input乱码 python3 乱码_python raw input乱码_03

  •   继续在网站中查 AE7D对应的BIG5

python raw input乱码 python3 乱码_文件名_04

  •   可以理解如下:

徐  -(Big5 编码)-> AE7D -(GBK 解码)-> 畗

所以出现问题的环节还是在红字加粗的部分。

  • 修复乱码
# 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'))

python raw input乱码 python3 乱码_python raw input乱码_05

  •   整个流程解释如下:

徐  -(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://zhuanlan.zhihu.com/p/26261762

http://cenalulu.github.io/linux/character-encoding/