Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符编码检测算法_Java_Character Encoding - Fatal编程技术网

Java 字符编码检测算法

Java 字符编码检测算法,java,character-encoding,Java,Character Encoding,我正在寻找一种在文档中检测字符集的方法。我一直在阅读Mozilla字符集检测实现: 我还发现了一个名为jCharDet的Java实现: 这两项研究都是基于使用一组静态数据进行的研究。我想知道的是,是否有人成功地使用了任何其他实现,如果有,是什么?您是否使用了自己的方法?如果是,您用于检测角色集的算法是什么 任何帮助都将不胜感激。我不是在通过谷歌寻找现有方法的列表,也不是在寻找Joel Spolsky文章的链接——只是为了澄清:) 更新:我对此进行了大量研究,最终找到了一个名为cpdetect

我正在寻找一种在文档中检测字符集的方法。我一直在阅读Mozilla字符集检测实现:

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

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

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

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

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


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

几年前,我们为邮件应用程序提供了字符集检测,我们推出了自己的。邮件应用程序实际上是一个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中不存在,反之亦然,因此有时您可以得到一个很好的匹配

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

用户选择


如果这些没有提供令人满意的结果,用户必须手动选择编码。

不完全是您要求的编码,但我注意到其中包含一个类。

这是一个难题。感谢您自己的研究中的伟大链接。有一个著名的例子:是的,关于记事本的问题,一旦我完成并完成,我会用我的研究修改我的帖子,一些有趣的东西…在Java中还有另一个移植:juniversalchardet看起来已经6年没有更新了;ICU在今年早些时候进行了更新。我假设您在链接中引用的系统使用了与我描述的类似的策略,但希望分享我们的经验会有所帮助。由于代码点范围的限制,UTF-32非常容易检测。有效的UTF-32代码单元将始终适合模式00{0x|10}xx xx xx(对于BE)或xx xx{0x|10}00(对于LE)。@JaredOberhaus您能展示一些关于第一步的java代码吗?另外,您如何找到第二步的正确编码组的项?