Woodstox 解析器在 Eclipse 中的测试 运行 中工作正常,但在命令行中失败
Woodstox parser works fine in test run in Eclipse, but fails from command line
我的一个 JUnit 测试(在幕后)使用了 Woodstox 解析器。
当我 运行 从 Eclipse 中进行测试时,测试按预期成功。
但是运行在命令行上进行同样的测试,使用
mvn clean test -Dtest=com.example.MyClassTest#someParserTest
导致测试失败并显示以下异常消息:
Error on line 114 column 21
SXXP0003: Error reported by XML parser: Invalid UTF-8 middle byte 0x3f (at char #4174, byte #3999)
...
at com.ctc.wstx.io.UTF8Reader.reportInvalidOther(UTF8Reader.java:314)
at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:205)
at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:84)
at com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:55)
at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:961)
at com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.java:4580)
at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3657)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1063)
at com.ctc.wstx.sax.WstxSAXParser.fireEvents(WstxSAXParser.java:524)
at com.ctc.wstx.sax.WstxSAXParser.parse(WstxSAXParser.java:452)
at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:440)
at net.sf.saxon.event.Sender.send(Sender.java:171)
at net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:363)
我看了一下待解析的InputStream
。 InputStream
在这两种情况下是相同的。
此外,InputStream
中没有"line 114 column 21"。第 114 行在第 11 列结束。
如何调查导致不同行为的原因?
事实证明,我使用的一个库对环境的默认字符编码(也称为平台的默认字符集)做出了错误的假设。
在Eclipse环境下,调用Charset.defaultCharset()
返回UTF-8,而在命令行环境下,返回CP1252 .
许多标准和第三方 Java API 的行为因平台的默认字符集而异,其中包括:
String.getBytes()
ByteArrayOutputStream.toString()
XMLOutputFactory.createXMLStreamWriter(OutputStream stream)
IOUtils.toString(InputStream input)
为了解决我的问题,我必须更新该库以明确使用正确的字符集:
String.getBytes(StandardCharsets.UTF_8)
ByteArrayOutputStream.toString( StandardCharsets.UTF_8.name() )
XMLOutputFactory.createXMLStreamWriter( OutputStream stream, StandardCharsets.UTF_8.name() )
IOUtils.toString(InputStream input, StandardCharsets.UTF_8)
我的一个 JUnit 测试(在幕后)使用了 Woodstox 解析器。
当我 运行 从 Eclipse 中进行测试时,测试按预期成功。
但是运行在命令行上进行同样的测试,使用
mvn clean test -Dtest=com.example.MyClassTest#someParserTest
导致测试失败并显示以下异常消息:
Error on line 114 column 21
SXXP0003: Error reported by XML parser: Invalid UTF-8 middle byte 0x3f (at char #4174, byte #3999)
...
at com.ctc.wstx.io.UTF8Reader.reportInvalidOther(UTF8Reader.java:314)
at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:205)
at com.ctc.wstx.io.ReaderSource.readInto(ReaderSource.java:84)
at com.ctc.wstx.io.BranchingReaderSource.readInto(BranchingReaderSource.java:55)
at com.ctc.wstx.sr.StreamScanner.loadMore(StreamScanner.java:961)
at com.ctc.wstx.sr.BasicStreamReader.readTextSecondary(BasicStreamReader.java:4580)
at com.ctc.wstx.sr.BasicStreamReader.finishToken(BasicStreamReader.java:3657)
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1063)
at com.ctc.wstx.sax.WstxSAXParser.fireEvents(WstxSAXParser.java:524)
at com.ctc.wstx.sax.WstxSAXParser.parse(WstxSAXParser.java:452)
at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:440)
at net.sf.saxon.event.Sender.send(Sender.java:171)
at net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:363)
我看了一下待解析的InputStream
。 InputStream
在这两种情况下是相同的。
此外,InputStream
中没有"line 114 column 21"。第 114 行在第 11 列结束。
如何调查导致不同行为的原因?
事实证明,我使用的一个库对环境的默认字符编码(也称为平台的默认字符集)做出了错误的假设。
在Eclipse环境下,调用Charset.defaultCharset()
返回UTF-8,而在命令行环境下,返回CP1252 .
许多标准和第三方 Java API 的行为因平台的默认字符集而异,其中包括:
String.getBytes()
ByteArrayOutputStream.toString()
XMLOutputFactory.createXMLStreamWriter(OutputStream stream)
IOUtils.toString(InputStream input)
为了解决我的问题,我必须更新该库以明确使用正确的字符集:
String.getBytes(StandardCharsets.UTF_8)
ByteArrayOutputStream.toString( StandardCharsets.UTF_8.name() )
XMLOutputFactory.createXMLStreamWriter( OutputStream stream, StandardCharsets.UTF_8.name() )
IOUtils.toString(InputStream input, StandardCharsets.UTF_8)