如何在 freemarker 模板处理中转义 unicode 符号?

How to escape unicode symbols in freemarker template processing?

我正在使用 freemarker 模板将 JSON 转换为 XML。它工作正常,除非输入 json 包含一些 unicode 符号。 直到现在我遇到了 en-dash 和 em-dash 并且 FTL 转换失败并显示: lexical error: encountered "u" (117)

当我对变量使用 ?eval 操作时模板失败。

我使用的是 freemarker v2.3.28,我已将编码设置为 UTF-8。

P.S。我检查过版权和商标符号是否正常工作。

问题当然是这些字符在源 JSON 中转义为 \uXXXX,但 FTL 字符串语法没有 \u 转义。 ?eval 将其输入解释为 FTL 表达式,而不是 JSON 表达式。它们恰好相似,但也有区别。 (顺便说一句,据我所知,en-dash 和 em-dash 不需要在 JSON 中转义,类似于版权,但当然它允许转义任何字符。)

怎么办? FreeMarker-ish 方法是将 JSON 添加到已经解析为 Map-s(或 Java bean)和 List-s 等的数据模型中。该模板不是用来解析输入的。如果那不可行,那么您可以将自定义方法添加到数据模型中(可能作为 Configuration 级别的共享变量),它会进行真正的 JSON 解析,然后您将其称为 eval_json(x).

无论如何,用例是什么?在模板中解析 JSON 的愿望经常出现在 SO 上。如果用例有效,也许下一个 FreeMarker 版本应该有一个 ?eval_json

首先通过将所有 unicode 替换为 html 个实体来预处理变量。

replaceAll("\\u(....)", "&#x;")

根据有关 Expressions, instead of "\uHHHH" you should use "\xHHHH" (x instead of u), where HHHH is one to four hexadecimal digits representing a UCS 的手册。

我试过这样的东西。在freemarker标签开始之前添加版权符号。

<div class="copyrightLine">
    &copy;${getString("2022 Corporation. All rights reserved.")?html}
</div>