0

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

我们现在已经切换到 Java 13。不再包含 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))
4

1 回答 1

1

你说得对,这是GraalJSScriptEngine. 和的read/write方法不匹配。这些问题应该通过这个改变来解决。该修复程序将在 GraalVM 20.2 和最新的开发版本中提供。Input/OutputStreamReader/Writer

于 2020-05-12T10:22:56.283 回答