如何确定流是否符合字符集编码ISO-8859-1

Gor*_*don 1 java iso-8859-1 character-encoding

我有一个问题,我需要能够检测字节数组是否包含符合ISO-8859-1编码的字符.

我发现以下问题有用Java:如何确定流的正确字符集编码,但没有一个答案似乎完全回答我的问题.

我试图使用TikaEncodingDetector,如下所示

public static Charset guessCharset(final byte[] content) throws IOException {
    final InputStream isx = new ByteArrayInputStream(content);
    return Charset.forName(new TikaEncodingDetector().guessEncoding(isx));
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种方法基于字节数组的内容做出不同的预测.例如,包含'h','e','l','l','o'的数组被确定为ISO-8859-1.'w','o','r','l','d'出现在IBM500,'a','b','c','d','e'产生UTF-8.

我想知道的是,我的字节数组是否正确验证了ISO-8859-1标准.对于执行这项任务的最佳方式的建议,我将不胜感激.

Jon*_*eet 8

我有一个问题,我需要能够检测字节数组是否包含符合ISO-8859-1编码的字符.

好吧,每个二进制数据流都可以在ISO-8859-1中被视为"有效",因为它只是一个单字节每字符方案,以一种简单的方式将字节0-255映射到U + 0000到U + 00FF.将其与UTF-8或UTF-16进行比较,其中某些字节序列无效.

因此,确定包含有效ISO-8859-1的流是否可以返回的方法true- 但这并不意味着原始文本是在ISO-8859-1中编码的...当用解码时对人类来说可能没有意义. ISO-8859-1,但仍然有效.

如果您知道原始纯文本不包含某些字符(例如,不可打印的控制字符),您可以通过检查流中的任何字节是否被列入黑名单来检测.更高级的检测可能会检查意外模式 - 但它变得非常具有启发性,并且可能与原始源文本的预期紧密耦合.

  • @biziclop:除了EBCDIC,当然......是的,如果你给出一个置信度分数,那么"一切都在32到127之间,或者标签/换行/回车"会给人很高的信心. (2认同)