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 · 5160 次点击
    这是一个创建于 3504 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个文件中既有gb2312又有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和GB2312的编码空间应该是有重叠,没办法自动解析,手工处理吧。
    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 - 按双字节拆分,用GB2312解码(其实这个步骤就是直接用GB2312解码)
    2 - 遇到GB2312无法解码的字符,明确标记为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 感觉这个方法处理纯中文应该可以,但一般文档是中英文都有的,其中英文部分gb2312和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 打开,某些部分可以用gb2312打开
    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 和 GB2312 混合编码的,神坑。
    突然想到一个好方法,可以分别以这两种编码作为原编码,都转换为 UTF-8,然后用工具比较两个文件做个合并。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2722 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:44 · PVG 14:44 · LAX 22:44 · JFK 01:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.