我的一个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
中没有“第114行第21行”。第114行在第11列结束。
我如何调查导致不同行为的原因?
答案 0 :(得分:0)
事实证明,我使用的库对环境的默认字符编码(也称为平台的默认字符集)做出了错误的假设。
在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)