【问题标题】:How to detect charset in Java?如何检测Java中的字符集?
【发布时间】:2012-04-13 17:14:23
【问题描述】:

半年前,我遇到了烦人的问题。仍然无法修复它。 问题在于 log4j-logging,其中默认字符集是 utf 8。

有时我会收到不同编码的消息,CP1252。 (没有办法改变这一点)。 因此,登录 utf8 会使文本不可读。 我可以以某种方式修复编码,并且此文本将在日志中可读。

但是如果我将那个“编码修复”应用到正常的消息上,它就会搞砸了。 我需要知道是否真的需要这种转换。不幸的是,我没有想法。

【问题讨论】:

  • 不可能可靠地检测文本块的编码。你通常必须知道你在处理什么。想必您可以确定您在 CP1252 中接收消息的情况,不是吗?这里更大的场景是什么?
  • 不。我无法预测 :( 据我所知,正常消息是 utf 8 和 cp1251。但其中一些可能取决于 Windows 语言,这就是它们在 CP1252 中的原因。我可以通过转换 1252->1251 使它们可读->utf8。但它肯定会弄乱正常的。

标签: java utf-8 character-encoding cp1252


【解决方案1】:

正如 deceze 所说,没有可靠的方法自动检测文本的编码。

大多数编码尝试对字符使用 1 个字节,因为相同的字节序列在不同的编码中意味着完全不同的字符串。几乎您唯一可以可靠地做的就是说“它不是有效的 UTF8 字符串”,其他常用的编码甚至没有严格的规则,哪些字节序列对其有效/无效。

您最好的选择是了解消息的编码。下一个选项是将文本保留为“utf8 字符串”旁边的字节数组。

如果您接受的编码集非常有限(utf8/utf16/cp1252),您可以尝试使用一些启发式方法来检测 - 即 UTF16 中的大多数英文字符串每隔一个字节就会有 0,您可以尝试查看字符串是否可以作为 UTF8 - 如果不是 - 则可能是剩余的编码。

【讨论】:

  • 看来,检查 utf 8 字符串的有效性是个不错的主意。哪种方法正确?
  • 如果它在到达您的代码时已经是“字符串”可能为时已晚,但如果它是使用 Ut8 编码转换为字符串的字节数组也应该进行检查(我不知道如何用Java来做,只是假设它类似于C#)。另请查看stackoverflow.com/questions/1677497/…,其中包含详细步骤和一些库参考。
  • 这是一种使用文件中的字节顺序标记来确定其编码的技术(如果非 cp1252 编码文件中缺少 BOM,则不能保证有效)stackoverflow.com/questions/1835430/…。否则,使用 ICU4J
【解决方案2】:

Apache Tika 包含一个开源编码检测器。

也有商业替代品。

【讨论】:

  • 我认为您必须非常不顾一切地将昂贵的(基于 NLP 的)编码检测器连接到消息传递应用程序的记录器。
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 2010-12-13
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多