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

时间:2018-05-24 21:03:08

标签: unicode freemarker org.json

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

根据关于 Expressions 的手册,您应该使用 "\uHHHH" 代替 "\xHHHH"x 而不是 u),其中 HHHH 是代表 {​​{3}} 的一到四个十六进制数字。