当前位置: 首页 > 面试题库 >

字符编码检测算法

范鸿
2023-03-14
问题内容

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

通用字符集检测

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

JCharDet

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

任何帮助,将不胜感激。我既不是通过Google寻找现有方法的清单,也不是在寻找Joel Spolsky文章的链接-只是为了澄清一下:)

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

CPD检测器

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

ICU4J

使用该框架为cpdetector编写自己的插件非常容易,该插件可提供更准确的字符编码检测算法。它比Mozilla方法更好。


问题答案:

几年前,我们对邮件应用程序进行了字符集检测,然后我们推出了自己的字符集。邮件应用程序实际上是WAP应用程序,而电话期望使用UTF-8。分几个步骤:

普遍

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

如果文件以UTF-16字节顺序标记开头,则可以假设文本的其余部分就是该编码。否则,除非可以检测到代理对模式,否则检测UTF-16几乎不像UTF-8那样容易:但是代理对的使用很少,因此通常不起作用。UTF-32与之类似,只是没有代理对可检测。

区域检测

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

中文编码和其他区域使用相同的步骤。

用户的选择

如果这些方法不能提供令人满意的结果,则用户必须手动选择一种编码。



 类似资料:
  • 问题内容: 似乎是一个相当热门的问题,但是我还没有找到解决方案。也许是因为它有 很多 风味。虽然在这里。我正在尝试读取一些用逗号分隔的文件(有时,分隔符可能比逗号更具独特性,但现在就可以使用逗号了)。 这些文件本应在整个行业中标准化,但是最近我们看到了许多不同类型的字符集文件。我希望能够设置BufferedReader来对此进行补偿。 执行此操作并检测是否成功的标准方法是什么? 我对这种方法的第一

  • 问题内容: 我读取了大约1000个文件名,其中一些文件以UTF8编码,而某些文件为CP1252。 我想将它们全部解码为Unicode,以便在脚本中进行进一步处理。有没有一种方法可以使源编码正确解码为Unicode? 例: 问题答案: 如果您的文件位于和中,则有一种简单的方法。 否则,有一个字符集检测库。 Python-检测字符集并转换为utf-8 https://pypi.python.org/p

  • 问题内容: 我目前正在开发一个用于验证和解析CSV文件的应用程序。CSV文件必须以UTF-8编码,尽管有时我们会以错误的编码获得文件。CSV文件很可能包含德语字母的特殊字符(Ä,Ö,Ü,ß),因为CSV文件中的大多数文本都是德语。 对于验证器,我需要确保文件是UTF-8编码的。只要不存在特殊字符,解析就很可能没有问题。 到目前为止,我尝试将文件读取为字节并使用一些库来检测(或猜测)编码。我尝试了此

  • So do not worry about tomorrow, for tomorrow will bring worries of its own. Today's trouble is enough for today. (MATTHEW 6:34) 字符编码 其实,标题前面应该加两个字——“坑爹”。 在实践中,字符编码的确是一个“坑”。因为这个世界上,不都是英文。如果都是英文,就没有这个问题

  • 问题内容: 我将承担将数据库从Latin1转换为UTF-8的繁琐而棘手的任务。 在这一点上,我只想检查存储在表中的数据类型,因为这将确定我应使用哪种方法转换数据。 具体来说,我想检查Latin1列中是否有UTF-8字符,什么是最好的方法?如果只影响几行,那么我可以手动修复它。 选项1.执行MySQL转储并使用Perl搜索UTF-8字符吗? 选项2。使用MySQL CHAR_LENGTH查找具有多字

  • 问题内容: 我有一个在GlassFish 3上运行的Java Web应用程序和在MySQL上的JPA(EclipseLink)上运行。我面临的问题是,如果使用该方法将实体保存到数据库中,则字段将丢失完整性;显示而不是某些字符。 服务器,页面和数据库配置为使用。 发布表单数据后,下一页将正确显示数据。此外,它在NetBeans中似乎“调试”当前实体的属性也存储了正确的值。如果可以信任NetBeans