遇到一个 python 文件,其中的中文显示像'卤卤戮漏','脤矛陆貌','脡脧潞拢','脰脴脟矛','潞脫卤卤','潞脫脛脧',
这样的乱码注释,尝试修改多种 IDE 的编辑器显示编码无果。
如果我知道每个词表示的是一个省份,能否找出对应的原始编码?
代码文件头是包含指定编码的部分,指定了两种,但是我尝试之后都无效。
部分代码如下
https://gist.github.com/sadscv/65bd4dcffc0bc4b119d9ba64b517a061
1
function007 2018-01-09 00:58:55 +08:00 1
是不是 GBK 被当 UTF-8 了
|
2
sadscv OP @function007 我尝试过摘取一段文字存成 str,encode 成 utf8 不会报错,但 encode 成 gbk 则会报 UnicodeEncodeError。
|
3
thautwarm 2018-01-09 01:22:51 +08:00 via Android
请不要在任何过程里使用 gbk,谢谢。无脑 utf8 的这一年,感觉很满足。
|
4
alcarl 2018-01-09 01:25:21 +08:00 via Android 3
先把这段字保存成 gb2312 编码的文件,然后转换成 utf8 编码,保存,然后再转换成 8859-1 保存,然后当成 gbk 打开就好了,=͟͟͞͞(꒪ᗜ꒪ ‧̣̥̇) 字是下面这样的
类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类) 参考 http://blog.zeerd.com/ffmpeg-c2c3-bug/ |
5
sadscv OP @alcarl 万分感谢您的回答,我研究了很久,还是不清楚该怎么做(哭),我是该写程序修复呢(只会 python),还是可以用什么软件快速搞定呢?
|
6
Arnie97 2018-01-09 02:27:42 +08:00 via Android 4
$ cat 编码问题 | iconv -f utf8 -t gbk | iconv -f utf8 -t latin1 | iconv -f gbk -t utf8 😂
|
7
sadscv OP |
8
Nioty 2018-01-09 03:02:43 +08:00 via Android 1
Lz 第一次打开发现乱码后不要进行任何改动 直接停止编辑转码正常后再继续编辑 要不乱码怎么转都是乱的
|
9
shihira 2018-01-09 03:29:46 +08:00 5
等我来破译一下。「潞脫」和「卤卤」出现了两次。「潞脫」出现了词头,所以「卤卤」应该就是东西南北了。纵观中国省份,方位词开头只有西藏,所以「卤卤戮漏」就是西藏了,那么「脛脧」应该就是东。「潞脫」要么是山要么是广
我编不下去了,也祝题主好运 |
10
thautwarm 2018-01-09 04:18:28 +08:00 via Android 1
如果你文本数量比较大,可以用 chardet 这个库来查编码,查到之后直接用对应 decode。文本少的话错误率很高。
已知编码的解码,讲道理可能非常简单,比如下面这个。当然,下面这个要是能直接解决你的问题,你就自己找个缝钻了好了。。 with open(f1name, 'r', encoding=当前编码) as f1, open(f2name, 'w', encoding=目标编码) as f2: f2.write(f1.read()) |
11
zhidian 2018-01-09 08:29:01 +08:00 1
六楼的可用, 这不是好好的吗?
``` ▶ cat ~/Downloads/test.txt | iconv -f utf-8 -t gbk | iconv -f utf-8 -t latin1 | iconv -f gbk -t utf-8 # -*- coding: cp936 -*- #coding=utf-8 import re, os, MySQLdb,urllib.request as req ######################## FileOperation 类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)############################## class FileOperation(): def delFile(self, fileList): # 删除文件 for eachFile in fileList: if os.path.exists(eachFile): os.remove(eachFile)% ``` |
12
zhidian 2018-01-09 08:32:09 +08:00 1
如果还是有问题, 试一下这个?: 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
六楼这魔法有点意思... |
13
rogwan 2018-01-09 08:40:35 +08:00 via Android 1
楼主确定乱码是中文的话,手动强制穷举啊。中文编码常用的就那么 4~5 种,一个一个的试比用 chardet 更准确。
|
14
imn1 2018-01-09 09:17:35 +08:00 1
经 @shihira #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 |
15
GeruzoniAnsasu 2018-01-09 09:20:16 +08:00
1. 首先'卤卤戮漏','脤矛陆貌','脡脧潞拢','脰脴脟矛','潞脫卤卤','潞脫脛脧'是以什么编码打开看到的? rb 方式打开读进来看看,如果是以 utf8 编码打开时看到的,那么 binary 对应 b'\xe5\x8d\xa4\xe5\x8d\xa4\xe6\x88\xae\xe6\xbc\x8f\xe8\x84\xa4\xe7\x9f\x9b\xe9\x99\x86\xe8\xb2\x8c\xe8\x84\xa1\xe8\x84\xa7\xe6\xbd\x9e\xe6\x8b\xa2\xe8\x84\xb0\xe8\x84\xb4\xe8\x84\x9f\xe7\x9f\x9b\xe6\xbd\x9e\xe8\x84\xab\xe5\x8d\xa4\xe5\x8d\xa4\xe6\xbd\x9e\xe8\x84\xab\xe8\x84\x9b\xe8\x84\xa7'
如果以 gbk 打开时看到,binary 对应 b'\xc2\xb1\xc2\xb1\xc2\xbe\xc2\xa9\xc3\x8c\xc3\xac\xc2\xbd\xc3\xb2\xc3\x89\xc3\x8f\xc2\xba\xc2\xa3\xc3\x96\xc3\x98\xc3\x87\xc3\xac\xc2\xba\xc3\x93\xc2\xb1\xc2\xb1\xc2\xba\xc3\x93\xc3\x84\xc3\x8f' 然而无论哪种 bianry 都看不出原编码应该是什么,错开一字节也看不出来。。。我觉得原文已经被篡改过了。 |
16
GeruzoniAnsasu 2018-01-09 09:23:57 +08:00 2
哦 抱歉,lz 我回来了并且还原出来了
还原步骤如下: s = '脡戮鲁媒脦脛录镁' >>> s.encode('gbk').decode('utf8').encode('latin-1').decode('gbk') '删除文件' |
17
GeruzoniAnsasu 2018-01-09 09:25:56 +08:00 1
f = lambda s:s.encode('gbk').decode('utf8').encode('latin-1').decode('gbk')
>>> f('######################## FileOperation 脌脿拢潞掳眉潞卢露脭脦脛录镁碌脛虏脵脳梅拢篓脦陋脕脣卤茫脫脷碌梅脢脭潞 脥鹿脹虏矛拢卢脦脪掳脩脥酶脪鲁脨脜脧垄脨麓脠毛脕脣脦脛录镁脰脨拢卢脣霉脪脭脫脨脕脣脮芒赂枚脦脛录镁虏脵脳梅脌脿拢漏##############################') '######################## FileOperation 类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)##############################' |
18
pacino 2018-01-09 11:22:42 +08:00
@GeruzoniAnsasu 你好棒,给你鼓掌👏
|
19
houm 2018-01-09 12:53:26 +08:00 1
看了 @GeruzoniAnsasu 的操作,这个文件的经历应该是这样的:
1.原始文件的编码是 GBK ( A 文件) 2.A 文件被当作 latin-1 编码而转换为 utf8 编码( B 文件) 3.B 文件被当作 GBK 编码再次转换为 utf8 编码( C 文件) C 文件就是楼主看到的文件,不管用什么编码查看都看不到正确结果。 GeruzoniAnsasu 是怎么想到这样操作的?经验丰富啊👍 |
20
qsnow6 2018-01-12 23:45:33 +08:00
这尼玛玩的,跟摩斯密码一样。。。
赶紧抛弃 py2 吧,这年头还有啥理由不上 PY3 |