V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
EnginDee
V2EX  ›  程序员

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

  •  
  •   EnginDee · 2016-07-10 18:12:36 +08:00 · 4009 次点击
    这是一个创建于 2840 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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