我应该怎么做才能正确编码 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/OutputStream
和 Reader/Writer
的 read/write
方法不匹配。这些问题应由 this change 解决。该修复程序将在 GraalVM 20.2 和最新的开发版本中可用。
我们正在 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/OutputStream
和 Reader/Writer
的 read/write
方法不匹配。这些问题应由 this change 解决。该修复程序将在 GraalVM 20.2 和最新的开发版本中可用。