如何检测非法的UTF-8字节序列以替换它们在java输入流中?

有问题的文件不在我的控制之下。大多数字节序列都是有效的 UTF-8,它不是 ISO-8859-1(或其他编码)。我想尽我所能提取尽可能多的信息。

该文件包含一些非法的字节序列,这些序列应替换为替换字符。

这不是一件容易的事,它认为它需要一些关于UTF-8状态机的知识。

Oracle有一个包装器,可以做我需要的事情:
UTF8ValidationFilter javadoc

有没有类似的东西(商业或作为自由软件)?

谢谢
斯蒂芬

溶液:

final BufferedInputStream in = new BufferedInputStream(istream);
final CharsetDecoder charsetDecoder = StandardCharsets.UTF_8.newDecoder();
charsetDecoder.onMalformedInput(CodingErrorAction.REPLACE);
charsetDecoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
final Reader inputReader = new InputStreamReader(in, charsetDecoder);

答案 1

java.nio.charset.CharsetDecoder做你需要的。此类提供字符集解码,其中包含对不同类型错误的用户可定义操作(请参阅 onMalformedInput()onUnmappableCharacter())。

CharsetDecoder写入一个 ,您可以通过管道将其放入一个使用 java.io.PipedOutputStream 中,从而有效地创建一个过滤的 .OutputStreamInputStreamInputStream


答案 2

一种方法是读取前几个字节以检查字节顺序标记(如果存在)。有关 BOM 的更多信息:http://en.wikipedia.org/wiki/Byte_order_mark 在给定的 url 中,您将找到 BOM 字节的表。但是,一个问题是,UTF-8 不需要在其标头中使用 BOM。解决这个问题的另一种方法是通过模式识别(每次读取几个字节-8位)。无论如何,这是复杂的解决方案。


推荐