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

标签 java encoding utf-8 inputstream illegal-characters

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

最佳答案

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

CharsetDecoder 写入 OutputStream,您可以使用 java.io.PipedOutputStream 将其通过管道传输到 InputStream ,有效地创建了一个过滤后的 InputStream

关于java - 如何检测非法的 UTF-8 字节序列以在 java 输入流中替换它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801890/

相关文章:

Java 正则表达式帮助

python - 在Python中显示西里尔字母

Python UTF-8 Latin-1 显示错误字符

java - Joda Time 意外格式

java - 设计模式问题

ruby - Ruby 2.0 中的二进制字符串文字

在 Windows 上提供 utf-8 文件功能的 php 库?

perl - “子程序条目中的宽字符”- UTF-8 编码的西里尔字母作为字节序列

java - 将 pdf 文件编码为 JSON 字符串时出错

java - 找不到 tools.jar。请检查 C :\Program Files\Java\jre1. 8.0_151 是否包含有效的 JDK 安装