Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UTF-16LE编码和xerces2 Java_Java_Xml_Utf 16_Xerces_Byte Order Mark - Fatal编程技术网

UTF-16LE编码和xerces2 Java

UTF-16LE编码和xerces2 Java,java,xml,utf-16,xerces,byte-order-mark,Java,Xml,Utf 16,Xerces,Byte Order Mark,我读了一些帖子,比如,答案说输入源实际上是一个字符流,而不是字节流 然而,建议的解决方案似乎不适用于UTF-16LE。尽管我使用此代码: try(最终输入流为=Files.newInputStream(filename.toPath(),StandardOpenOption.READ)){ DOMParser parser=new org.apache.xerces.parsers.DOMParser(); parser.parse(新的InputSource(is)); 返回parser.ge

我读了一些帖子,比如,答案说输入源实际上是一个字符流,而不是字节流

然而,建议的解决方案似乎不适用于UTF-16LE。尽管我使用此代码:

try(最终输入流为=Files.newInputStream(filename.toPath(),StandardOpenOption.READ)){
DOMParser parser=new org.apache.xerces.parsers.DOMParser();
parser.parse(新的InputSource(is));
返回parser.getDocument();
}捕获(最终SAXParseException saxEx){
debug(“无法将[{}}]作为InputSource打开。”,absolutePath,saxEx);
}
我仍然得到
org.xml.sax.SAXParseException:prolog中不允许包含内容。

我查看了Files.newInputStream,它确实使用了
ChannelInputStream
,它将传递字节,而不是字符。我还尝试设置InputSource对象的编码,但没有成功。
我还检查了
之前没有额外的字符(除了BOM),以便进一步收集一些信息:

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);
}
byte[]bytes=Files.readAllBytes(filename.toPath);
字符串xml=新字符串(字节,StandardCharsets.utf16le);
if(xml.startsWith(“\uFEFF”)){
LOG.info(“有BOM,显然是UTF_16LE”);
xml=xml.substring(1);
}

如果(!xml.contains(“如果在开始时删除BOM(跳过前两个字节)会怎么样?”
…{is.read():is.read();
,那么如果没有BOM或ISO-8859-1,我将无法读取UTF-8(编码在
中给出或默认为UTF-8。我听说在极少数情况下BOM会出现这样的问题。但我不记得具体细节。我甚至不能做到这一点。我想读取您所指的标记和属性。但看到我的第二次编辑,它会在此之前停止。我仔细检查了。文件以BOM 0xFF 0xFE开头。也许我需要要将其包装成BOMRemovingInputStream…我用
xxd
查看了文件,我知道它的开头是\uFFFE。字节FF-FE在UTF-16LE中实际上是字符
\uFEFF
又称BOM(有点奇怪的Unicode数字)嘿,顺便提一下。由于UTF-8字节的BOM是
EF BB BF
,这在某种程度上解释了您的编辑-2:0xbfef。IntelliJ和
文件都显示这是一个UTF-16LE文件。UTF16LE以
\uFFFE
开头
\uFFFE
并不奇怪,根据维基百科的说法,它是“无字符”“字符。第二次编辑无意中使用了UTF-8解释,当我再次将UTF16LE放回时没有任何变化:((深呼吸)…MAVEN资源筛选。我一直在查看源代码,但在查看目标时,您可以在o/t文件的开头看到一些额外的字节。非常抱歉看到这样的情况:(