代码中包含的中文全为乱码,编码问题求请教! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sadscv
V2EX    Python

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

  •  
  •   sadscv 2018-01-09 00:51:02 +08:00 7285 次点击
    这是一个创建于 2837 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    -- coding: cp936 --

    coding=utf-8

    部分代码如下

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

    第 1 条附言    2018-01-09 15:59:22 +08:00
    我这边也能成功解决该问题了。我就不逐个 @,在此一并谢谢各位,向无私帮助的 v 友们致敬。

    另外在贴中意外发现,通过给出的省份来进行破译竟是个不错的解迷游戏,我就把更多乱码后的省份发出来,看各位能否靠 9 楼这样的方法,不借助编码解码工具,仅凭已知省份猜出更多信息,祝各位玩得开心。

    '卤卤戮漏','矛陆貌','潞拢','矛','潞卤卤','潞','','镁','潞煤陆颅','潞镁','掳虏禄','陆露芦','陆庐','陆颅','茫陆颅','陆颅梅','潞镁卤卤','鹿茫梅','赂','陆梅','鹿','梅', '录陋','赂拢陆篓','鹿贸','鹿茫露芦','潞拢','梅虏','麓篓','镁','潞拢','篓氓','茫赂','掳'
    20 条回复    2018-01-12 23:45:33 +08:00
    function007
        1
    function007  
       2018-01-09 00:58:55 +08:00   1
    是不是 GBK 被当 UTF-8 了
    sadscv
        2
    sadscv  
    OP
       2018-01-09 01:04:32 +08:00
    @function007 我尝试过摘取一段文字存成 str,encode 成 utf8 不会报错,但 encode 成 gbk 则会报 UnicodeEncodeError。
    thautwarm
        3
    thautwarm  
       2018-01-09 01:22:51 +08:00 via Android
    请不要在任何过程里使用 gbk,谢谢。无脑 utf8 的这一年,感觉很满足。
    alcarl
        4
    alcarl  
       2018-01-09 01:25:21 +08:00 via Android   3
    先把这段字保存成 编码的文件,然后转换成 utf8 编码,保存,然后再转换成 8859-1 保存,然后当成 gbk 打开就好了,=( ) 字是下面这样的
    类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)

    参考 http://blog.zeerd.com/ffmpeg-c2c3-bug/
    sadscv
        5
    sadscv  
    OP
       2018-01-09 02:13:43 +08:00
    @alcarl 万分感谢您的回答,我研究了很久,还是不清楚该怎么做(哭),我是该写程序修复呢(只会 python),还是可以用什么软件快速搞定呢?
    Arnie97
        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
    sadscv
        7
    sadscv  
    OP
       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
        8
    Nioty  
       2018-01-09 03:02:43 +08:00 via Android   1
    Lz 第一次打开发现乱码后不要进行任何改动 直接停止编辑转码正常后再继续编辑 要不乱码怎么转都是乱的
    shihira
        9
    shihira  
       2018-01-09 03:29:46 +08:00   5
    等我来破译一下。「潞」和「卤卤」出现了两次。「潞」出现了词头,所以「卤卤」应该就是东西南北了。纵中国省份,方位词开头只有西藏,所以「卤卤戮漏」就是西藏了,那么「」应该就是东。「潞」要么是山要么是广

    我编不下去了,也祝题主好运
    thautwarm
        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())
    zhidian
        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)%
    ```
    zhidian
        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

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

    s = '戮鲁媒录镁'
    >>> s.encode('gbk').decode('utf8').encode('latin-1').decode('gbk')
    '删除文件'
    GeruzoniAnsasu
        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 类:包含对文件的操作(为了便于调试和观察,我把网页信息写入了文件中,所以有了这个文件操作类)##############################'
    pacino
        18
    pacino  
       2018-01-09 11:22:42 +08:00
    @GeruzoniAnsasu 你好棒,给你鼓掌
    houm
        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 是怎么想到这样操作的?经验丰富啊
    qsnow6
        20
    qsnow6  
       2018-01-12 23:45:33 +08:00
    这尼玛玩的,跟摩斯密码一样。。。

    赶紧抛弃 py2 吧,这年头还有啥理由不上 PY3
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5239 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 07:21 PVG 15:21 LAX 00:21 JFK 03:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86