16

有问题的文件不在我的控制之下。大多数字节序列都是有效的 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);
4

3 回答 3

12

java.nio.charset.CharsetDecoder 可以满足您的需求。此类提供字符集解码以及针对不同类型错误的用户可定义操作(请参阅onMalformedInput()onUnmappableCharacter())。

CharsetDecoder写入 an OutputStream,您可以将其通过管道输入InputStreamusing java.io.PipedOutputStream,从而有效地创建过滤的InputStream.

于 2010-09-27T08:07:52.313 回答
0

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

于 2010-09-27T15:54:06.773 回答
0

您想要的行为已经是InputStreamReader. 所以不需要自己指定。这足以:

final BufferedInputStream in = new BufferedInputStream(istream);
final Reader inputReader = new InputStreamReader(in, StandardCharsets.UTF_8);
于 2016-02-09T11:21:38.573 回答