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

Posted

技术标签:

【中文标题】如何在 freemarker 模板处理中转义 unicode 符号?【英文标题】:How to escape unicode symbols in freemarker template processing? 【发布时间】:2018-11-04 04:47:56 【问题描述】:

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

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

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

附:我检查了版权和商标符号是否正常工作。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这是如何解决问题的?我之所以问,是因为我仍然很好奇 ?eval_json 是否是一个好主意,是否有一个频繁且适当的用例。 谢谢@ddekany !!早些时候,当我尝试使用 freemarker 模板时,我只是解析了*** json 对象以及我使用的任何嵌套对象?eval。这一直有效,直到我得到这些 un​​icode 符号。现在根据您的建议,我在将整个 JSON 传递给模板之前解析它,它工作正常。只是出于好奇,如何检查这些字符是否在源 JSON 中转义为 \uXXXX ?我直接从 elasticsearch 获取我的 json。 ?eval_json 会很好!现在我只是将整个 json 解析为 Map 并将其传递给模板。 P.S:我确认提到的所有 unicode 符号 here 在我的情况下都失败了。 @noobCoder 我相信预先解析整个 JSON 是正确的方法。这肯定比记住在模板中调用?eval_json 容易。还是不是? @noobCoder 关于这个问题,我注意到我理解它。您可以在字符串中搜索前面没有 \ 的 \u【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于如何在 freemarker 模板处理中转义 unicode 符号?的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 Freemarker 中转义正则表达式字符串

如何在 vue 组件的刀片模板中转义变量

如何在 AWS CloudFormation YAML 模板中转义策略变量

如何在 robots.txt Disallow 指令中转义 $?

如何在 grails 脚手架 _form 模板中转义 <% %> 块

在速度模板中转义引号