Java 告诉SAX解析器忽略无效字符?

Java 告诉SAX解析器忽略无效字符?,java,xml,parsing,sax,Java,Xml,Parsing,Sax,SAX在以下异常情况下继续消亡: Invalid byte 2 of 3-byte UTF-8 sequence 问题在于它的UTF-8编码基本正确,但也有一些错误。我们无法获得该文件的新版本,我们必须使用该文件 那么,我们如何告诉SAX忽略无效的字符序列,或者清理UTF-8文件,使其不包含无效的UTF-8序列呢?您可以在SAX读取流之前对其进行过滤。 创建一个InputStream,它读取您的流并删除无效字符。我建议您将文件作为一个完全独立的步骤来清理,而不是将其解析为XML UTF-8是一

SAX在以下异常情况下继续消亡:

Invalid byte 2 of 3-byte UTF-8 sequence
问题在于它的UTF-8编码基本正确,但也有一些错误。我们无法获得该文件的新版本,我们必须使用该文件


那么,我们如何告诉SAX忽略无效的字符序列,或者清理UTF-8文件,使其不包含无效的UTF-8序列呢?

您可以在SAX读取流之前对其进行过滤。
创建一个InputStream,它读取您的流并删除无效字符。

我建议您将文件作为一个完全独立的步骤来清理,而不是将其解析为XML

UTF-8是一种相当容易理解的编码方式;显示了UTF-8是如何形成的。我建议你写一个程序,读入你的输入文件,然后写出一个新文件。它将一个字节一个字节地读取,只有当它看到一个字符的格式是有效的时才写出它。当它看到一个无效字节时,它会写出字符串“UTF8ERROR”或其他一些在输入数据中不会自然出现的易于查找的标记。然后它将跳过角色的其余部分

之后,您可以检查错误发生的位置并修复数据。。。然后按正常方式解析它

通过这种方式,您将看到错误有多普遍,是否存在任何模式,并有可能纠正错误。如果你想从同一来源获得更多的数据,我强烈建议你告诉他们这个问题。。。SAX(和其他XML工具)设计用于处理格式良好(或在需要时有效)的XML。当输入格式不正确时,它们故意抛出错误或异常,包括不符合编码。因此,正如其他答案所建议的,您必须使用单独的步骤来清理输入


(类似地,SAX将抛出格式不正确的HTML错误,例如缺少结束标记)

我想这对你帮助不大,但也许其他人想知道:

我最近在检索带有ISO-8859-1头的UTF-8XML文件时遇到了相同的异常。解决方案是通过String.getBytes(字符集)手动指定UTF-8:

编辑:。。或者更简单:

public Document parseRequest(HttpServletRequest request) {
   DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();

   Reader reader = new InputStreamReader(request.getInputStream(), "UTF-8");
   InputSource source = new InputSource(reader);
   return domFactory.newDocumentBuilder().parse(source);
}

您能否以某种方式将
java.nio.charset.CharsetDecoder
InputStreamReader(InputStream-in,CharsetDecoder-dec)
一起使用

如何处理解码错误 取决于请求执行的操作 所描述的那种类型的错误 通过一个例子 CodingErrorAction类。可能的 错误操作将忽略 输入错误,请将错误报告给 调用程序通过返回的 CoderResult对象,或替换 当前值输入错误 替换字符串的名称。这个 替换具有初始值 “\uFFFD”;其值可通过以下方式更改: 替换为方法


(来自
CharsetDecoder
javadoc)

我想这是对一些人来说的,但这是一种显而易见的说法。(:因此,基本上你确认了我不希望做的事情。我们必须编写自己的UTF-8消毒剂。恐怕是这样。网络上可能已经有类似的东西,但我不知道。寻找其他人与你的确切问题表明,你可能指定了错误的编码。如果是这种情况,可能是一个错误单击修复。检查此处:抱歉,gunslinger,这不是一个快速修复。问题是utf-8编码文件中混合了非utf-8字符。确实对某些人有用的信息,但您是正确的,这并不能解决存储在单个文件中的混合编码问题。有趣的想法,我不确定。
public Document parseRequest(HttpServletRequest request) {
   DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();

   Reader reader = new InputStreamReader(request.getInputStream(), "UTF-8");
   InputSource source = new InputSource(reader);
   return domFactory.newDocumentBuilder().parse(source);
}