[英]UTF-16LE encoding and xerces2 Java
我经历了几篇文章,例如FileReader将文件作为字符流读取, 如果将文档 作为字符流 处理,则可以将其视为空格,其中答案表示输入源实际上是char流,而不是字节流。
但是,从1开始的建议解决方案似乎不适用于UTF-16LE。 尽管我使用以下代码:
try (final InputStream is = Files.newInputStream(filename.toPath(), StandardOpenOption.READ)) {
DOMParser parser = new org.apache.xerces.parsers.DOMParser();
parser.parse(new InputSource(is));
return parser.getDocument();
} catch (final SAXParseException saxEx) {
LOG.debug("Unable to open [{}}] as InputSource.", absolutePath, saxEx);
}
我仍然收到org.xml.sax.SAXParseException: Content is not allowed in prolog.
。
我查看了Files.newInputStream,它确实使用ChannelInputStream
,它将移交字节而不是char。 我也尝试设置InputSource对象的Encoding,但是没有运气。 我还检查了<?xml
部分之前是否没有多余的字符(BOM除外)。
我还要提及的是,此代码与UTF-8配合使用也很好。
//编辑:我也尝试了DocumentBuilderFactory.newInstance()。newDocumentBuilder()。parse()和XmlInputStreamReader.next(),结果相同。
//编辑2:使用带缓冲的读取器尝试。 结果相同:序言中出现意外字符“뿯”(代码49135 / 0xbfef); 预期的“ <”
提前致谢。
为了进一步了解一些信息,请执行以下操作:
byte[] bytes = Files.readAllBytes(filename.toPath);
String xml = new String(bytes, StandardCharsets.UTF_16LE);
if (xml.startsWith("\uFEFF")) {
LOG.info("Has BOM and is evidently UTF_16LE");
xml = xml.substring(1);
}
if (!xml.contains("<?xml")) {
LOG.info("Has no XML declaration");
}
String declaredEncoding = xml.replaceFirst("<?xml[^>]*encoding=[\"']([^\"']+)[\"']", "$1");
if (declaredEncoding == xml) {
declaredEncoding = "UTF-8";
}
LOG.info("Declared as " + declaredEncoding);
try (final InputStream is = new ByteArrayInputStream(xml.getBytes(declaredEncoding))) {
DOMParser parser = new org.apache.xerces.parsers.DOMParser();
parser.parse(new InputSource(is));
return parser.getDocument();
} catch (final SAXParseException saxEx) {
LOG.debug("Unable to open [{}}] as InputSource.", absolutePath, saxEx);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.