Мы обрабатываем JSON в нашей программе Scala, выполняя динамически сгенерированный код JavaScript. Это нормально работало в Java 8 при использовании встроенного скриптового движка Nashorn.
Теперь мы переключились на Java 13. Насхорн больше не включен, поэтому мы добавили Грааль JS вместо него. Он работает нормально, за исключением того, что в выводе неправильно обрабатываются международные символы. Похоже, вывод дважды транслируется в 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))