我应该怎么做才能正确编码 GraalJS 脚本引擎的脚本输出?

How should I do to get the script output from the GraalJS script engine encoded correctly?

我们正在 Scala 程序中通过执行动态生成的 Java 脚本代码来处理 JSON。当使用包含的 Nashorn 脚本引擎时,这在 Java 8 中运行良好。

我们现在切换到 Java13。不再包含 Nashorn,因此我们包含了 GraalJS。它工作正常,除了国际字符在输出中处理错误。看起来输出被转换为 UTF-8 两次。

这是一个显示问题的简短示例:

val engine = GraalJSScriptEngine.create(null,
    Context.newBuilder("js")
            .option("js.ecmascript-version", "2020")
            .option("js.script-engine-global-scope-import", "false")
);

val scriptOutput = new StringWriter()
engine.getContext.setWriter(scriptOutput)

engine.eval("print('Test åäö !');")
val out = scriptOutput.toString
println(out);

结果是:Test ᅢᆬᅢ내ᄊ !

我是不是做错了,或者这是 GraalJSScriptEngine 中的错误?我找不到任何关于它的文档。

注意:我暂时解决了,用我自己的存储原始字节的StringWriter,然后再读成UTF-8,但是感觉不像方法...

val buff = ArrayBuffer[Byte]()
val scriptOutput = new StringWriter() {
    override def write(c: Int): Unit =
        buff.append(c.asInstanceOf[Byte]) 
}

// Execute JavaScript code

val out = IOUtils.toString(new InputStreamReader(new ByteArrayInputStream(buff.toArray), StandardCharsets.UTF_8))

你是对的,这是 GraalJSScriptEngine 中的错误。 Input/OutputStreamReader/Writerread/write 方法不匹配。这些问题应由 this change 解决。该修复程序将在 GraalVM 20.2 和最新的开发版本中可用。