我想写一个文本纠正程序,问题来了,面对各种 txt ,我怎样才能智能的识别各种编码?
我的这个程序,就是简单调整有些下载的 txt ,有些被插入大量的换行符, 我的程序,就是把这些不该有的换行符删除。 纠正常见的基本错误。 这样阅读器打开文本,排版就正常一些了。
1
EnginDee OP 我可能会使用 node js 来写。 求帮助。 Java 也行。
|
2
UnisandK 2016-07-10 18:29:58 +08:00
原理不知道,但收藏有这个功能的工具
https://beyondcow.com/textpal/ |
3
shyling 2016-07-10 18:34:50 +08:00 via iPad
在 ruby 里有 valid_encoding?
node 里试试 iconv 吧 java 里用 java.nio.charset 总之就是用 Charset 按顺序一个一个试。。一定要有顺序哦 |
4
shiny 2016-07-10 18:37:13 +08:00
顺序非常重要,错了就会乱码
|
5
busyluo 2016-07-10 18:37:27 +08:00 via iPhone
从最严格的编码开始试,遇到不正确的内容就跳过,试下一个。 你可以参考 vim 的源码。(我没有看过 vim 源码,理论上可行)
|
6
breeswish 2016-07-10 18:43:23 +08:00
|
7
murmur 2016-07-10 18:55:51 +08:00
除了 chardet 似乎没别的方法。。。因为大家都不太喜欢 bom 头这个东西
|
8
wangxn 2016-07-10 19:03:01 +08:00 via Android
Mozilla 有个开源项目。但没办法做到 100%精确。
|
9
xuboying 2016-07-10 19:12:48 +08:00 via Android
不能识别编码,除非你上大数据,要么你让用户指定 fall back 编码
|
11
zhuangzhuang1988 2016-07-10 20:49:06 +08:00
notepad++ 的源码翻翻看..
|
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 |
16
mbbill 2016-07-11 00:40:12 +08:00
@busyluo 可能我说的不是很清楚,举个例子,比如你把 cp936 和 big5 都放到 fileencodings 里面就是没有意义的。同一个码点在不同编码里面都是合法的,这就需要用统计学的方法来探测了。
|
17
Arnie97 2016-07-11 00:41:10 +08:00 via Android 1
怎么感觉你重造轮子了,推荐一个软件 http://www.gidot.net/typesetter/
|
18
congeec 2016-07-11 01:04:28 +08:00 via iPhone
vim 会像 enca, chardet 一样猜文件编码
Set fileencodings 后不跟任何内容的输出就是文件编码,加上=才是设置编码 我还经常在 UTF8 终端里用 vim 打开 GBK 编码的文件呢 |
20
linux40 2016-07-11 07:27:30 +08:00 via Android
选几个字符查找?
|
21
zouxy 2016-07-11 09:28:24 +08:00
我的思路:
1 )有 BOM 按 BOM 来。 2 )没 BOM 的情况下,按配置的次序(把最常用的放在前面)一个个检测合法性。 3 )合法的情况下,分析里边的词是不是真的词。另外一个比较简单但我觉得有效的办法,只统计字,如果转出来的结果都是生僻字就是转错了。这个简单办法我之前自己写的过滤垃圾短信相当有效果,常用汉字就 3000 多个。 4 )有一部分仍然是错的,就用其它高级一点的办法。如果要求不高估计前三条差不多够你用了。 |
22
mbbill 2016-07-11 10:57:54 +08:00
@congeec vim 没有 enca 这样猜编码的能力。能从 UTF8 fallback 到 GBK 是因为 UTF8 编码严格,尝试转换失败了。:h fileencodings 看看。如果你把 GBK 放 UTF8 前面,很多 utf8 的文档就被当成 GBK 打开然后乱码了。
|
23
EnginDee OP 程序写好了,在这里: https://github.com/dajbd/txt-beautifier
|
25
mbbill 2016-07-14 14:54:36 +08:00
@congeec 上次一次搞这事儿是 10 年前了。。 http://www.vim.org/scripts/script.php?script_id=1708 有兴趣可以试试
|