HTML转义反转义疑问:xmlFormat与DecodeForHTML是否互为逆操作?
xmlFormat和DecodeForHTML是否互为逆操作的解答 这个问题我刚好碰到过,咱们一步步理清楚:
1. 先搞懂两个函数的核心作用
xmlFormat()的行为
xmlFormat()是ColdFusion里用来转义XML特殊字符的工具,目的是避免原始字符串破坏XML结构。它会把以下字符转换成对应的实体编码:
<→<>→>&→&"→"'→'
比如你传入<div>Hi & Bye</div>,xmlFormat会返回<div>Hi & Bye</div>。
DecodeForHTML()的行为
DecodeForHTML()的功能是把HTML实体编码还原成原始字符。巧的是,XML实体其实是HTML实体的子集,所以它能完美识别并解码xmlFormat()生成的所有实体——比如把<转回<,&转回&,以此类推。
2. 两者是否互为逆操作?
在绝大多数场景下(也就是你的rc.content是未经预先转义的原始文本/HTML),是的,它们完全互为逆操作。
举个实际例子验证:
- 原始内容:
<p>Hello "World" & Others</p> - 经过
xmlFormat()处理后:<p>Hello "World" & Others</p> - 再经过
DecodeForHTML()还原:<p>Hello "World" & Others</p>
这时候你用<cfoutput>#DecodeForHTML(resultsofreturn)#</cfoutput>就能正常渲染HTML标签,不会再显示那些转义后的实体字符。
要注意的例外情况
如果你的rc.content本身已经包含了XML/HTML实体(比如用户手动输入了&),那xmlFormat()会把&再次转义成&,最终得到&amp;。这时候DecodeForHTML()只会解码一次,得到&而不是原始的&。不过这种情况比较少见,只要rc.content是纯原始内容,就不用额外处理。
总结
如果你的rc.content是未经过转义的原始数据,直接用DecodeForHTML(resultsofreturn)就能完美还原xmlFormat()转义前的内容,放心用就行!
内容的提问来源于stack exchange,提问作者James A Mohler

