如何在 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">
©${getString("2022 Corporation. All rights reserved.")?html}
</div>
我正在使用 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">
©${getString("2022 Corporation. All rights reserved.")?html}
</div>