代码中包含的中文全为乱码,编码问题求请教!

2018-01-09 00:51:02 +08:00
 sadscv

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

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

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

-- coding: cp936 --

coding=utf-8

部分代码如下

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

6536 次点击
所在节点    Python
20 条回复
function007
2018-01-09 00:58:55 +08:00
是不是 GBK 被当 UTF-8 了
sadscv
2018-01-09 01:04:32 +08:00
@function007 我尝试过摘取一段文字存成 str,encode 成 utf8 不会报错,但 encode 成 gbk 则会报 UnicodeEncodeError。
thautwarm
2018-01-09 01:22:51 +08:00
请不要在任何过程里使用 gbk,谢谢。无脑 utf8 的这一年,感觉很满足。
alcarl
2018-01-09 01:25:21 +08:00
先把这段字保存成 gb2312 编码的文件,然后转换成 utf8 编码,保存,然后再转换成 8859-1 保存,然后当成 gbk 打开就好了,=͟͟͞͞(꒪ᗜ꒪ ‧̣̥̇) 字是下面这样的
类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)

参考 http://blog.zeerd.com/ffmpeg-c2c3-bug/
sadscv
2018-01-09 02:13:43 +08:00
@alcarl 万分感谢您的回答,我研究了很久,还是不清楚该怎么做(哭),我是该写程序修复呢(只会 python),还是可以用什么软件快速搞定呢?
Arnie97
2018-01-09 02:27:42 +08:00
$ cat 编码问题 | iconv -f utf8 -t gbk | iconv -f utf8 -t latin1 | iconv -f gbk -t utf8 😂
sadscv
2018-01-09 02:58:17 +08:00
@Arnie97 感谢,可是这个语句在我这边尝试失败了。。。错误显示:iconv: 未知 122 处的非法输入序列,不知在您这边是否尝试过?
我使用 cat file.py | iconv -f utf8 -t gbk 也会报上述错误,改为 cat file.py | iconv -f utf8 -t latin1 不报错,但是出来的字符仍为乱码,并且后续转换的尝试也以失败告终。
Nioty
2018-01-09 03:02:43 +08:00
Lz 第一次打开发现乱码后不要进行任何改动 直接停止编辑转码正常后再继续编辑 要不乱码怎么转都是乱的
shihira
2018-01-09 03:29:46 +08:00
等我来破译一下。「潞脫」和「卤卤」出现了两次。「潞脫」出现了词头,所以「卤卤」应该就是东西南北了。纵观中国省份,方位词开头只有西藏,所以「卤卤戮漏」就是西藏了,那么「脛脧」应该就是东。「潞脫」要么是山要么是广

我编不下去了,也祝题主好运
thautwarm
2018-01-09 04:18:28 +08:00
如果你文本数量比较大,可以用 chardet 这个库来查编码,查到之后直接用对应 decode。文本少的话错误率很高。

已知编码的解码,讲道理可能非常简单,比如下面这个。当然,下面这个要是能直接解决你的问题,你就自己找个缝钻了好了。。
with open(f1name, 'r', encoding=当前编码) as f1, open(f2name, 'w', encoding=目标编码) as f2:
f2.write(f1.read())
zhidian
2018-01-09 08:29:01 +08:00
六楼的可用, 这不是好好的吗?

```
▶ 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)%
```
zhidian
2018-01-09 08:32:09 +08:00
如果还是有问题, 试一下这个?: 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

六楼这魔法有点意思...
rogwan
2018-01-09 08:40:35 +08:00
楼主确定乱码是中文的话,手动强制穷举啊。中文编码常用的就那么 4~5 种,一个一个的试比用 chardet 更准确。
imn1
2018-01-09 09:17:35 +08:00
经 @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
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 都看不出原编码应该是什么,错开一字节也看不出来。。。我觉得原文已经被篡改过了。
GeruzoniAnsasu
2018-01-09 09:23:57 +08:00
哦 抱歉,lz 我回来了并且还原出来了
还原步骤如下:

s = '脡戮鲁媒脦脛录镁'
>>> s.encode('gbk').decode('utf8').encode('latin-1').decode('gbk')
'删除文件'
GeruzoniAnsasu
2018-01-09 09:25:56 +08:00
f = lambda s:s.encode('gbk').decode('utf8').encode('latin-1').decode('gbk')

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

'######################## FileOperation 类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)##############################'
pacino
2018-01-09 11:22:42 +08:00
@GeruzoniAnsasu 你好棒,给你鼓掌👏
houm
2018-01-09 12:53:26 +08:00
看了 @GeruzoniAnsasu 的操作,这个文件的经历应该是这样的:
1.原始文件的编码是 GBK ( A 文件)
2.A 文件被当作 latin-1 编码而转换为 utf8 编码( B 文件)
3.B 文件被当作 GBK 编码再次转换为 utf8 编码( C 文件)
C 文件就是楼主看到的文件,不管用什么编码查看都看不到正确结果。
GeruzoniAnsasu 是怎么想到这样操作的?经验丰富啊👍
qsnow6
2018-01-12 23:45:33 +08:00
这尼玛玩的,跟摩斯密码一样。。。

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/421212

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX