如何在 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。这一直有效,直到我得到这些 unicode 符号。现在根据您的建议,我在将整个 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 符号?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS CloudFormation YAML 模板中转义策略变量
如何在 robots.txt Disallow 指令中转义 $?