Как мне сделать, чтобы вывод скрипта из движка скриптов Graal JS был правильно закодирован? - PullRequest
0 голосов
/ 08 мая 2020

Мы обрабатываем 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))

1 Ответ

1 голос
/ 12 мая 2020

Вы правы, что это ошибка в GraalJSScriptEngine. Несоответствие между read/write методами Input/OutputStream и Reader/Writer. Эти проблемы должны быть исправлены этим изменением . Исправление будет доступно в GraalVM 20.2 и в последних разрабатываемых сборках.

...