• 请不要在回答技术问题时复制粘贴 AI 生成的内容
EnginDee
V2EX  ›  程序员

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

  •  
  •   EnginDee · Jul 10, 2016 · 5140 views
    This topic created in 3775 days ago, the information mentioned may be changed or developed.

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

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

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