繁体   English   中英

UTF-16LE编码和xerces2 Java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM