代码之家  ›  专栏  ›  技术社区  ›  Jonathan Holloway

字符编码检测算法

  •  44
  • Jonathan Holloway  · 技术社区  · 15 年前

    Universal Charset Detection

    我还发现了一个名为jCharDet的Java实现:

    JCharDet

    这两项研究都是基于使用一组静态数据进行的研究。我想知道的是,是否有人成功地使用了任何其他实现,如果有,是什么?您是否使用了自己的方法?如果是,您用于检测角色集的算法是什么?

    任何帮助都将不胜感激。我不是在通过谷歌寻找现有方法的列表,也不是在寻找Joel Spolsky文章的链接——只是为了澄清:)

    更新: 我对此做了一系列研究,最终找到了一个名为cpdetector的框架,它使用可插入的方法进行字符检测,请参见:

    CPDetector

    这提供了BOM、chardet(Mozilla方法)和ASCII检测插件。你自己写也很容易。还有另一个框架,它提供了比Mozilla方法/jchardet等更好的字符检测。。。

    ICU4J

    为cpdetector编写自己的插件非常容易,它使用这个框架来提供更精确的字符编码检测算法。它比Mozilla方法工作得更好。

    2 回复  |  直到 15 年前
        1
  •  10
  •   Jared Oberhaus    15 年前

    几年前,我们为邮件应用程序提供了字符集检测,我们推出了自己的。邮件应用程序实际上是一个WAP应用程序,手机需要UTF-8。有几个步骤:

    普遍的

    我们可以很容易地检测文本是否为UTF-8,因为在字节2/3/等的顶部位中有一个特定的位模式。一旦发现该模式重复一定次数,就可以确定它是UTF-8。

    如果文件以UTF-16字节顺序标记开头,则可以假定其余文本就是该编码。否则,检测UTF-16远不如检测UTF-8容易,除非您可以检测代理项对模式:但代理项对的使用很少,因此通常不起作用。UTF-32类似,只是没有要检测的代理项对。

    区域探测

    接下来我们假设读者在某个区域。例如,如果用户看到的是日语本地化的UI,那么我们可以尝试检测三种主要的日语编码。ISO-2022-JP再次向东探测逃逸序列。如果失败,确定EUC-JP和Shift JIS之间的差异就不是那么简单了。用户很可能会收到Shift JIS文本,但EUC-JP中有一些字符在Shift JIS中不存在,反之亦然,因此有时您可以得到一个很好的匹配。

    同样的程序也用于中文编码和其他地区。

    用户选择

        2
  •  7
  •   McDowell rahul gupta    15 年前

    不完全是你想要的,但我注意到 ICU project 包括 CharsetDetector