一个文件多种字符编码,如何解析 - 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
ivito
V2EX    Python

一个文件多种字符编码,如何解析

  •  
  •   ivito
    fireboyvt 2015-04-22 08:58:40 +08:00 via iPhone 5499 次点击
    这是一个创建于 3826 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个文件中既有又有utf8,意思就是不能用一种编码解析出来,有什么办法把该文件解析成同一种编码呢
    21 条回复    2018-04-02 23:50:29 +08:00
    clino
        1
    clino  
       2015-04-22 09:18:09 +08:00
    两个都试试咯,有UnicodeDecodeError之类的就试下一个编码,不过这种方法碰到两种都能decode的就抓瞎了
    future0906
        2
    future0906  
       2015-04-22 09:20:54 +08:00
    UTF-8和的编码空间应该是有重叠,没办法自动解析,手工处理吧。
    clino
        3
    clino  
       2015-04-22 09:23:12 +08:00
    或者碰到两种都能decode的才人工判断下,只有一种能decode就能自动了
    bombless
        4
    bombless  
       2015-04-22 09:24:19 +08:00
    这个时候你需要 ML (逃

    要不基于某种马卡罗夫链?(再逃
    amaranthf
        5
    amaranthf  
       2015-04-22 09:31:56 +08:00
    这两种编码混杂在同一个文件中,几乎不可能自动识别吧,毕竟编码有重叠。只能人工喽。
    io
        6
    io  
       2015-04-22 09:34:12 +08:00
    神经网络
    ivito
        7
    ivito  
    OP
       2015-04-22 09:37:49 +08:00 via iPhone
    @clino 确实,不知道从哪个字节开始用哪一种编码
    ivito
        8
    ivito  
    OP
       2015-04-22 09:38:40 +08:00 via iPhone
    @future0906 不知道编辑器是怎么处理的,遇到无法解析的会显示乱码怎么实现的呢
    ivito
        9
    ivito  
    OP
       2015-04-22 09:40:43 +08:00 via iPhone
    @clino
    @bombless
    @io
    @amaranthf
    看来只能用算法解决了
    mhycy
        10
    mhycy  
       2015-04-22 09:52:07 +08:00
    你需要一个常用词列表才有可能进行部分自动的转换
    方案如下:
    1 - 按双字节拆分,用解码(其实这个步骤就是直接用解码)
    2 - 遇到无法解码的字符,明确标记为UTF-8
    3 - 一般中文在UTF-8都使用3字节进行储存,所以对于这篇文文章照样进行三字节拆分
    4 - 移位三次,提出确认落在 u4E00 - u9FFF 范围内的的字符
    5 - 上常用词表进行过滤
    (如果常用词表有文字使用频率的话,多个解码结果进行加权投票选字能提高成功率)
    mhycy
        11
    mhycy  
       2015-04-22 09:55:18 +08:00
    补充个地址:
    http://www.oschina.net/question/102136_40922
    这帖子提到的UTF-8的编码规律可以作为一个模式进行判断..
    ivito
        12
    ivito  
    OP
       2015-04-22 10:01:53 +08:00 via iPhone
    @mhycy 感觉这个方法处理纯中文应该可以,但一般文档是中英文都有的,其中英文部分和utf8兼容ascii 只有一个字节,按照你的思路稍微做一些修改应该可以,但没想好用什么数据结构表示结果中产生的多种可能性
    imn1
        13
    imn1  
       2015-04-22 10:05:58 +08:00
    如果是标记语言文本,并且知道有什么编码,就容易些,按标签分割判断
    纯文本的话,如果两种编码之间没有明确分界,例如换行,就很难办了
    mhycy
        14
    mhycy  
       2015-04-22 10:10:36 +08:00
    @ivito 人生苦短...用python
    这种事先把算法弄出来,性能还是别管了
    英文处理的确是个问题,但一般这些编码混合都是大段编码混叠的
    多几次处理应该可以..就看怎么写了...
    ivito
        15
    ivito  
    OP
       2015-04-22 10:13:51 +08:00 via iPhone
    @mhycy 靠谱,先写一版试试
    zouxy
        16
    zouxy  
       2015-04-22 10:21:10 +08:00
    想不到还有这种需求.
    如果只有中文.还可以搞搞.
    如果是全世界的文字,就没办法了.
    FrankFang128
        17
    FrankFang128  
       2015-04-22 10:22:57 +08:00 via Android
    靠猜
    ivito
        18
    ivito  
    OP
       2015-04-22 10:25:14 +08:00 via iPhone
    @zouxy 有些文档不知道怎么弄的,里边就有乱码,某些部分可以用utf8 打开,某些部分可以用打开
    ivito
        19
    ivito  
    OP
       2015-04-22 10:25:47 +08:00 via iPhone
    @FrankFang128 字符太多,没法一个一个猜啊
    mhycy
        20
    mhycy  
       2015-04-22 10:35:27 +08:00
    @zouxy
    我们公司的陈年老代码曾经输出过这样的文档...
    幸好有数据库访问权和源码,改写代码完事...
    SHF
        21
    SHF  
       2018-04-02 23:50:29 +08:00
    MacType 的源码就是 Shift-JIS 和 混合编码的,神坑。
    突然想到一个好方法,可以分别以这两种编码作为原编码,都转换为 UTF-8,然后用工具比较两个文件做个合并。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:47 PVG 06:47 LAX 15:47 JFK 18:47
    Do have faith in what you're doing.
    ubao 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