UTF-16LE编码和xerces2 Java
我读了一些帖子,比如,答案说输入源实际上是一个字符流,而不是字节流 然而,建议的解决方案似乎不适用于UTF-16LE。尽管我使用此代码: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
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文件的开头看到一些额外的字节。非常抱歉看到这样的情况:(