好的,让我们来看看这个:
#3
HTML编码
#
变成#
(十六进制实体)
3
变成3
(不需要编码)
&
变成&
(命名实体)
#
变成#
(十六进制实体)
4
变成4
(不需要编码)
注意:

在您的示例中是C arriage R eturn 和 Line F eed ,所以基本上 . 前面有一个换行符#3
。我们暂时忽略这一点。
3&4
HTML解码
无论您是否使用decodeForHtml()
或canonicalize()
:
#
成为#
3
成为3
&
成为&
#
成为#
4
成为4
这是绝对正确的,这里没有问题。所以...
为什么我看到□?
这很简单:您正在以 HTML 格式输出解码后的值。
如果您告诉浏览器呈现#3
为 HTML,浏览器将“智能检测”不完整的实体。实体总是以&
. 这就是为什么您应该将实际的 & 符号编码为&
,以便浏览器将其识别为文字字符。如今,大多数浏览器会自动检测单个/独立&
并对其进行相应的编码。但是,在您的情况下,浏览器假定您要说
(缩写
或
),它是控制字符 EOT并且无法打印,从而导致 □。
解决方案
每当您想在 HTML 中显示某些内容时,都必须对值进行编码。如果您需要检查 ColdFusion 中的变量,请选择<cfdump var="#value#">
(或writeDump(value)
)而不是仅通过<cfoutput>#value#</cfoutput>
(或writeOutput(value)
)输出值。
演示
https://cffiddle.org/app/file?filepath=6926a59a-f639-4100-b802-07a17ff79c53/5d545e2c-01a4-4c13-9f50-eb15777fba8c/6307a84e-89a3-411d-874f-7d32bd9a9874.cfm
<cfset charsToEncode = [
"##", <!--- we have to escape # in ColdFusion by doubling it --->
"3",
"&",
"##", <!--- we have to escape # in ColdFusion by doubling it --->
"4"
]>
<h2>encodeForHtml</h2>
<cfloop array="#charsToEncode#" index="char">
<cfdump var="#encodeForHtml(char)#"><br>
</cfloop>
<cfset charsToDecode = [
"&##x23;", <!--- we have to escape # in ColdFusion by doubling it --->
"3",
"&",
"&##x23;", <!--- we have to escape # in ColdFusion by doubling it --->
"4"
]>
<h2>decodeForHtml</h2>
<cfloop array="#charsToDecode#" index="char">
<cfdump var="#decodeForHtml(char)#"><br>
</cfloop>
<h2>canonicalize</h2>
<cfloop array="#charsToDecode#" index="char">
<cfdump var="#canonicalize(char, false, false)#"><br>
</cfloop>
<h2>encoding the output PROPERLY</h2>
<cfoutput>#encodeForHtml("##3&##4")#</cfoutput><br>
<cfoutput>#encodeForHtml(decodeForHtml("&##x23;3&&##x23;4"))#</cfoutput><br>
Note: due to the mix of entities, canonicalize() has to guess the begin/end of each entity and is having issues with the ampersand here:<br>
<cfoutput>#encodeForHtml(canonicalize("&##x23;3&##x26;&##x23;4", false, false))#</cfoutput><br>
<h2>encoding the output INCORRECTLY</h2>
#3<br>
<cfoutput>#decodeForHtml("&##x23;3&&##x23;4")#</cfoutput><br>
<cfoutput>#canonicalize("&##x23;3&&##x23;4", false, false)#</cfoutput><br>