我在项目中看到的代码是
${'myproj.label' @i18n, format=[sighltyObj.field1], context='text'}
意图是将变量传递给i18n文本+安全地编码文本。这是否正确使用显示上下文和i18n翻译?当我使用field1 =“Hello%20World”进行测试时,它不是对文本进行编码而是按原样进行渲染。 如何在将参数作为变量传递给i18n时对html字符串进行编码?
答案 0 :(得分:0)
HTL不会解码 format
返回的文字。我认为混淆来自于显示上下文text
以下内容的文档:
将此用于简单的HTML内容 - 对所有HTML进行编码
(资料来源:HTL Specification Section 1.2.1 Display Context)
但这并不意味着此上下文解码任何内容,编码 HTML标记。
因此,如果sighltyObj.field1
为Hello%20World
,则不将呈现为Hello World
,而是呈现为Hello%20World
,您已经注意到了。
显示上下文text
将编码给定文本中的所有HTML标记,这样您就无法将它们“走私”为文本(请参阅代码注入)。
例如:
${'<p>This is my text</p>' @ context='text'}
将创建以下HTML
<p>This is my text</p>
请注意p
标记编码:
<p>
成为<p>
,</p>
成为</p>
。
field1
中sighltyObj
的获取者必须执行解码,以便Hello%20World
变为Hello World
。 Stackoverflow上已有答案向您展示如何执行此操作:https://stackoverflow.com/a/6138183/190823
String result = java.net.URLDecoder.decode(url, "UTF-8");