Python代码中的中文显示为乱码,如何解决编码问题?

遇到一个 python 文件,其中的中文显示像'卤卤戮漏','脤矛陆貌','脡脧潞拢','脰脴脟矛','潞脫卤卤','潞脫脛脧',这样的乱码注释,尝试修改多种 IDE 的编辑器显示编码无果。

如果我知道每个词表示的是一个省份,能否找出对应的原始编码?

代码文件头是包含指定编码的部分,指定了两种,但是我尝试之后都无效。

-- coding: cp936 --

coding=utf-8

部分代码如下

https://gist.github.com/sadscv/65bd4dcffc0bc4b119d9ba64b517a061


Python代码中的中文显示为乱码,如何解决编码问题?

19 回复

是不是 GBK 被当 UTF-8 了


核心原因: 文件编码、终端/编辑器编码、字符串处理这三者不匹配。

解决方案:

  1. 文件头声明编码(必须做) 在Python文件开头(第一或第二行)添加编码声明:

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

    或者

    # coding: utf-8
    

    这告诉Python解释器你的源代码文件是用UTF-8编码保存的。

  2. 确保文件实际以UTF-8保存

    • VSCode/Sublime等编辑器:右下角确认编码显示为UTF-8。
    • Notepad++:编码 → 转为UTF-8编码 → 保存。
    • PyCharm:File → Settings → Editor → File Encodings,确保所有选项都是UTF-8。
  3. 处理字符串时明确指定编码

    # 读取文件时
    with open('file.txt', 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 写入文件时
    with open('file.txt', 'w', encoding='utf-8') as f:
        f.write("你好,世界")
    
    # 网络请求/数据库操作等,在接收数据时也需确认编码
    
  4. 配置你的终端/控制台(Windows重点) Windows的cmd默认编码是GBK,需要改为UTF-8:

    • 临时修改:在命令行执行 chcp 65001
    • 永久修改(PowerShell):
      New-ItemProperty -Path "HKCU:\Console" -Name "CodePage" -Value 65001 -PropertyType DWord
      
    • 或者直接使用支持UTF-8的终端,如Windows Terminal、Git Bash。

一句话总结: 统一用UTF-8,并在文件、代码和运行环境里都明确它。

我尝试过摘取一段文字存成 str,encode 成 utf8 不会报错,但 encode 成 gbk 则会报 UnicodeEncodeError。

请不要在任何过程里使用 gbk,谢谢。无脑 utf8 的这一年,感觉很满足。

先把这段字保存成 gb2312 编码的文件,然后转换成 utf8 编码,保存,然后再转换成 8859-1 保存,然后当成 gbk 打开就好了,=͟͟͞͞(꒪ᗜ꒪ ‧̣̥̇) 字是下面这样的
类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)

参考 http://blog.zeerd.com/ffmpeg-c2c3-bug/

万分感谢您的回答,我研究了很久,还是不清楚该怎么做(哭),我是该写程序修复呢(只会 python),还是可以用什么软件快速搞定呢?

$ cat 编码问题 | iconv -f utf8 -t gbk | iconv -f utf8 -t latin1 | iconv -f gbk -t utf8 😂

感谢,可是这个语句在我这边尝试失败了。。。错误显示:iconv: 未知 122 处的非法输入序列,不知在您这边是否尝试过?
我使用 cat file.py | iconv -f utf8 -t gbk 也会报上述错误,改为 cat file.py | iconv -f utf8 -t latin1 不报错,但是出来的字符仍为乱码,并且后续转换的尝试也以失败告终。

Lz 第一次打开发现乱码后不要进行任何改动 直接停止编辑转码正常后再继续编辑 要不乱码怎么转都是乱的

如果你文本数量比较大,可以用 chardet 这个库来查编码,查到之后直接用对应 decode。文本少的话错误率很高。

已知编码的解码,讲道理可能非常简单,比如下面这个。当然,下面这个要是能直接解决你的问题,你就自己找个缝钻了好了。。
with open(f1name, ‘r’, encoding=当前编码) as f1, open(f2name, ‘w’, encoding=目标编码) as f2:
f2.write(f1.read())

六楼的可用, 这不是好好的吗?

<br>▶ cat ~/Downloads/test.txt | iconv -f utf-8 -t gbk | iconv -f utf-8 -t latin1 | iconv -f gbk -t utf-8<br># -*- coding: cp936 -*-<br>#coding=utf-8<br>import re, os, MySQLdb,urllib.request as req<br><br>######################## FileOperation 类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)##############################<br>class FileOperation():<br><br> def delFile(self, fileList): # 删除文件<br> for eachFile in fileList:<br> if os.path.exists(eachFile):<br> os.remove(eachFile)%<br>

如果还是有问题, 试一下这个?: export LC_ALL=“en_US.UTF-8”; cat input.txt | iconv -f utf-8 -t gbk | iconv -f utf-8 -t latin1 | iconv -f gbk -t utf-8

六楼这魔法有点意思…

楼主确定乱码是中文的话,手动强制穷举啊。中文编码常用的就那么 4~5 种,一个一个的试比用 chardet 更准确。

经 #9 提示,可见与 GBK 有关

卤卤戮漏 -> 北京
脤矛陆貌 -> 天津
脡脧潞拢 -> 上海
脰脴脟矛 -> 重庆
潞脫卤卤 -> 河北
潞脫脛脧 -> 河南

这个应该是二次转换的结果:
先存 GBK,然后用 HEX 查看
C2 B1 C2 B1 C2 BE C2 A9 ->
[在 GBK 里面,下同] B1B1 -> 北; BEA9 -> 京 (C2 开头不变,取紧跟的两个)

C3 8C C3 AC C2 BD C3 B2 ->
CCEC -> 天; BDF2 -> 津 (C3 开头,将后一位+4,即 8+4=C)

后面就不写了
C3 89 C3 8F C2 BA C2 A3
C3 96 C3 98 C3 87 C3 AC
C2 BA C3 93 C2 B1 C2 B1
C2 BA C3 93 C3 84 C3 8F

哦 抱歉,lz 我回来了并且还原出来了
还原步骤如下:

s = ‘脡戮鲁媒脦脛录镁’
>>> s.encode(‘gbk’).decode(‘utf8’).encode(‘latin-1’).decode(‘gbk’)
‘删除文件’

f = lambda s:s.encode(‘gbk’).decode(‘utf8’).encode(‘latin-1’).decode(‘gbk’)

>>> f(’######################## FileOperation 脌脿拢潞掳眉潞卢露脭脦脛录镁碌脛虏脵脳梅拢篓脦陋脕脣卤茫脫脷碌梅脢脭潞 脥鹿脹虏矛拢卢脦脪掳脩脥酶脪鲁脨脜脧垄脨麓脠毛脕脣脦脛录镁脰脨拢卢脣霉脪脭脫脨脕脣脮芒赂枚脦脛录镁虏脵脳梅脌脿拢漏##############################’)

’######################## FileOperation 类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)##############################’

你好棒,给你鼓掌👏

看了 的操作,这个文件的经历应该是这样的:
1.原始文件的编码是 GBK ( A 文件)
2.A 文件被当作 latin-1 编码而转换为 utf8 编码( B 文件)
3.B 文件被当作 GBK 编码再次转换为 utf8 编码( C 文件)
C 文件就是楼主看到的文件,不管用什么编码查看都看不到正确结果。
GeruzoniAnsasu 是怎么想到这样操作的?经验丰富啊👍

这尼玛玩的,跟摩斯密码一样。。。

赶紧抛弃 py2 吧,这年头还有啥理由不上 PY3

回到顶部