如何找出一个流是否符合字符集编码ISO-8859-1



我有一个问题,我需要能够检测字节数组是否包含符合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));
}

不幸的是,这种方法根据字节数组的内容做出了不同的预测。例如,包含'h','e','l','l','o'的数组被确定为ISO-8859-1。' w ', ' o ', ' r ', ' l ', ' d ' IBM500出来,‘",' b ', ' c ', ' d ', ' e '导致utf - 8。

我想知道的是,我的字节数组是否正确验证ISO-8859-1标准。

如果您能就完成这项任务的最佳方法提出建议,我将不胜感激。

我有一个问题,我需要能够检测字节数组是否包含符合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解码时,它可能对人类没有意义,但仍然有效。

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

ISO-8859-1,或Latin-1,是一个没有太多结构的单字节编码,至少没有格式。它不容易与其他单字节编码区分开。

然而,字节0通常不会出现在文本中,并且可能指向两个字节的编码,如UTF-16LE或UTF-16BE。

然而,像UTF-8这样的多字节编码是可检测的,因为它遵循严格的格式。

ISO-8859-1可能与Windows-1252、Windows Latin-1混淆。中的不同字符可能会被统计识别,因为涉及到插入。

EBCDIC,单字节编码是完全不同的。

对ISO-8859-*编码有帮助的是有频繁的语言单词列表&它们的编码,并通过最佳匹配确定语言加编码。

周围有一些语言识别器

最新更新