如何确定流是否符合字符集编码 ISO-8859-1
How to find out if a stream complies with the charset encoding ISO-8859-1
我遇到一个问题,我需要能够检测字节数组是否包含符合 ISO-8859-1 编码的字符。
我发现以下问题很有用 Java : How to determine the correct charset encoding of a stream 但是 none 的答案似乎完全回答了我的问题。
我尝试使用如下所示的 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出来,'a','b','c','d','e' 结果为 UTF-8。
我只想知道,我的字节数组是否正确地验证了 ISO-8859-1 标准。如果您能提供有关执行此任务的最佳方法的建议,我将不胜感激。
I have a problem whereby I need to be able to detect whether a byte array contains characters which comply with ISO-8859-1 encoding.
那么 每个 二进制数据流都可以被视为 ISO-8859-1 中的 "valid",因为它只是一个每个字符一个字节的方案映射字节 0-255 到 U+0000 到 U+00FF 以一种简单的方式。将其与 UTF-8 或 UTF-16 进行比较,其中某些字节序列根本无效。
因此,确定流是否包含有效 ISO-8859-1 的方法可以 return 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-* 编码有帮助的是拥有语言及其编码的常用词列表,并通过最佳匹配识别语言和编码。
周围有一些语言识别器。
我遇到一个问题,我需要能够检测字节数组是否包含符合 ISO-8859-1 编码的字符。
我发现以下问题很有用 Java : How to determine the correct charset encoding of a stream 但是 none 的答案似乎完全回答了我的问题。
我尝试使用如下所示的 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出来,'a','b','c','d','e' 结果为 UTF-8。
我只想知道,我的字节数组是否正确地验证了 ISO-8859-1 标准。如果您能提供有关执行此任务的最佳方法的建议,我将不胜感激。
I have a problem whereby I need to be able to detect whether a byte array contains characters which comply with ISO-8859-1 encoding.
那么 每个 二进制数据流都可以被视为 ISO-8859-1 中的 "valid",因为它只是一个每个字符一个字节的方案映射字节 0-255 到 U+0000 到 U+00FF 以一种简单的方式。将其与 UTF-8 或 UTF-16 进行比较,其中某些字节序列根本无效。
因此,确定流是否包含有效 ISO-8859-1 的方法可以 return 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-* 编码有帮助的是拥有语言及其编码的常用词列表,并通过最佳匹配识别语言和编码。
周围有一些语言识别器。