我想写一个文本纠正程序,问题来了,面对各种 txt,我怎样才能智能的识别各种编码? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
EnginDee

我想写一个文本纠正程序,问题来了,面对各种 txt,我怎样才能智能的识别各种编码?

  •  
  •   EnginDee 2016 年 7 月 10 日 4688 次点击
    这是一个创建于 3575 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想写一个文本纠正程序,问题来了,面对各种 txt ,我怎样才能智能的识别各种编码?

    我的这个程序,就是简单调整有些下载的 txt ,有些被插入大量的换行符, 我的程序,就是把这些不该有的换行符删除。 纠正常见的基本错误。 这样阅读器打开文本,排版就正常一些了。

    div class="sep20">
    25 条回复    2016-07-14 14:54:36 +08:00
    EnginDee
        1
    EnginDee  
    OP
       2016 年 7 月 10 日
    我可能会使用 node js 来写。 求帮助。 Java 也行。
    UnisandK
        2
    UnisandK  
       2016 年 7 月 10 日
    原理不知道,但收藏有这个功能的工具
    https://beyondcow.com/textpal/
    shyling
        3
    shyling  
       2016 年 7 月 10 日 via iPad
    在 ruby 里有 valid_encoding?
    node 里试试 iconv 吧
    java 里用 java.nio.charset
    总之就是用 Charset 按顺序一个一个试。。一定要有顺序哦
    shiny
        4
    shiny  
    PRO
       2016 年 7 月 10 日
    顺序非常重要,错了就会乱码
    busyluo
        5
    busyluo  
       2016 年 7 月 10 日 via iPhone
    从最严格的编码开始试,遇到不正确的内容就跳过,试下一个。 你可以参考 vim 的源码。(我没有看过 vim 源码,理论上可行)
    breeswish
        6
    breeswish  
       2016 年 7 月 10 日
    murmur
        7
    murmur  
       2016 年 7 月 10 日
    除了 chardet 似乎没别的方法。。。因为大家都不太喜欢 bom 头这个东西
    wangxn
        8
    wangxn  
       2016 年 7 月 10 日 via Android
    Mozilla 有个开源项目。但没办法做到 100%精确。
    xuboying
        9
    xuboying  
       2016 年 7 月 10 日 via Android
    不能识别编码,除非你上大数据,要么你让用户指定 fall back 编码
    mbbill
        10
    mbbill  
       2016 年 7 月 10 日
    @busyluo vim 是没有这个功能的
    zhuangzhuang1988
        11
    zhuangzhuang1988  
       2016 年 7 月 10 日
    notepad++ 的源码翻翻看..
    laoyur
        12
    laoyur  
       2016 年 7 月 10 日
    突然想起了 N 年前做 Symbian 文本阅读器的时代
    智能检测 UTF-8 ( w/ w/o BOM )、 UTF-16LE/BE 、 GBK 、 Shift-JIS 、 BIG-5
    EnginDee
        13
    EnginDee  
    OP
       2016 年 7 月 10 日
    @laoyur Symbian 也是我的记忆啊……现在还怀念 s60v3 ,你当初是怎么智能识别编码的?
    busyluo
        14
    busyluo  
       2016 年 7 月 10 日 via iPhone
    @mbbill set fileencodings 不就是?
    mbbill
        15
    mbbill  
       2016 年 7 月 11 日
    @busyluo 这是手动设置编码,并不是楼主说的智能识别
    mbbill
        16
    mbbill  
       2016 年 7 月 11 日
    @busyluo 可能我说的不是很清楚,举个例子,比如你把 cp936 和 big5 都放到 fileencodings 里面就是没有意义的。同一个码点在不同编码里面都是合法的,这就需要用统计学的方法来探测了。
    Arnie97
        17
    Arnie97  
       2016 年 7 月 11 日 via Android   1
    怎么感觉你重造轮子了,推荐一个软件 http://www.gidot.net/typesetter/
    congeec
        18
    congeec  
       2016 年 7 月 11 日 via iPhone
    vim 会像 enca, chardet 一样猜文件编码
    Set fileencodings 后不跟任何内容的输出就是文件编码,加上=才是设置编码
    我还经常在 UTF8 终端里用 vim 打开 GBK 编码的文件呢
    busyluo
        19
    busyluo  
       2016 年 7 月 11 日 via iPhone
    @mbbill 想识别编码,也只能通过这种方法了吧。想绝对准确也不可能。
    linux40
        20
    linux40  
       2016 年 7 月 11 日 via Android
    选几个字符查找?
    zouxy
        21
    zouxy  
       2016 年 7 月 11 日
    我的思路:
    1 )有 BOM 按 BOM 来。
    2 )没 BOM 的情况下,按配置的次序(把最常用的放在前面)一个个检测合法性。
    3 )合法的情况下,分析里边的词是不是真的词。另外一个比较简单但我觉得有效的办法,只统计字,如果转出来的结果都是生僻字就是转错了。这个简单办法我之前自己写的过滤垃圾短信相当有效果,常用汉字就 3000 多个。
    4 )有一部分仍然是错的,就用其它高级一点的办法。如果要求不高估计前三条差不多够你用了。
    mbbill
        22
    mbbill  
       2016 年 7 月 11 日
    @congeec vim 没有 enca 这样猜编码的能力。能从 UTF8 fallback 到 GBK 是因为 UTF8 编码严格,尝试转换失败了。:h fileencodings 看看。如果你把 GBK 放 UTF8 前面,很多 utf8 的文档就被当成 GBK 打开然后乱码了。
    EnginDee
        23
    EnginDee  
    OP
       2016 年 7 月 13 日
    程序写好了,在这里: https://github.com/dajbd/txt-beautifier
    congeec
        24
    congeec  
       2016 年 7 月 14 日
    @mbbill 你是对的,我错了。。。
    mbbill
        25
    mbbill  
       2016 年 7 月 14 日
    @congeec 上次一次搞这事儿是 10 年前了。。 http://www.vim.org/scripts/script.php?script_id=1708 有兴趣可以试试
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1282 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 59ms UTC 17:28 PVG 01:28 LAX 10:28 JFK 13:28
    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