解析含Impresión的XML字节数组时出现UTF-8编码错误求助
解决XML解析时的Invalid byte 2 of 4-byte UTF-8 sequence错误
这个问题我之前处理过!核心原因是你解析XML时默认用UTF-8编码,但你的字节数组实际编码和UTF-8不匹配——尤其是像Impresión里的重音字符ó,在不同编码里的字节结构差异很大,直接用UTF-8解析非UTF-8编码的字节就会触发这个错误。
下面给你几个亲测有效的解决方案:
方案一:明确指定解析编码
直接用InputStreamReader包裹输入流,指定字节数组实际的编码(比如常见的ISO-8859-1、Windows-1252),这样解析器就能正确识别特殊字符:
final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = builderFactory.newDocumentBuilder(); final Document document; try (final InputStream stream = new ByteArrayInputStream(bytearray); // 替换成你字节数组实际的编码,比如ISO-8859-1 final InputStreamReader reader = new InputStreamReader(stream, "ISO-8859-1")) { document = builder.parse(new InputSource(reader)); }
方案二:统一编码为UTF-8
如果你的XML声明里已经指定了encoding="UTF-8",那可以先把字节数组转成UTF-8编码再解析:
import java.nio.charset.StandardCharsets; final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = builderFactory.newDocumentBuilder(); final Document document; // 假设原字节数组是ISO-8859-1编码,先转成UTF-8 String xmlStr = new String(bytearray, "ISO-8859-1"); byte[] utf8Bytes = xmlStr.getBytes(StandardCharsets.UTF_8); try (final InputStream stream = new ByteArrayInputStream(utf8Bytes)) { document = builder.parse(stream); }
方案三:用Unicode转义替换特殊字符
你提到的Unicode表示法也是可行的——把特殊字符换成对应的Unicode转义序列,比如把ó替换成\u00F3,这样生成的XML字节数组不管用什么编码,解析器都能正确识别:
// 原字符串替换为Unicode转义后的版本 String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><text>Impresi\u00F3n</text>"; byte[] bytearray = xmlContent.getBytes(StandardCharsets.UTF_8); // 后续解析代码不变,此时不会报错 final DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); final DocumentBuilder builder = builderFactory.newDocumentBuilder(); final Document document; try (final InputStream stream = new ByteArrayInputStream(bytearray)) { document = builder.parse(stream); }
小提示
优先推荐方案一或方案二,因为Unicode转义会降低XML的可读性,适合作为兜底方案。另外可以用文本编辑器打开XML文件(如果能拿到原文件),查看它的实际编码,这样能更精准地解决问题。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

