0

我的一个 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)

我看了一下 to-be-parsed InputStream。在这InputStream两种情况下 s 是相同的。

此外,在InputStream. 第 114 行在第 11 列结束。

如何调查导致不同行为的原因?

4

1 回答 1

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)
于 2016-10-25T16:09:11.800 回答