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 · 6515 次点击
    这是一个创建于 2291 天前的主题,其中的信息可能已经有所发展或是发生改变。

    遇到一个 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
    先把这段字保存成 gb2312 编码的文件,然后转换成 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   ·   我们的愿景   ·   实用小工具   ·   5277 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:51 · PVG 15:51 · LAX 00:51 · JFK 03:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.