我们通过执行动态生成的 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))