Coldfusion/Lucee 使用 EncodeForHTML 时的编码问题

Coldfusion/Lucee Encoding Issue When Using EncodeForHTML

运行 对某些字符(在本例中为表情符号)使用 EncodeForHTML 时出现问题

本例中的文字是: ⌛️abc ‍♀️‍♀️‍♀️

现在如果我只是直接输出

<cfoutput>#txt#</cfoutput>

显示正确,没有问题,但如果我先使用 EncodeForHTML

<cfoutput>#EncodeForHTML(txt)#</cfoutput>

我明白了 ⌛️a��b��c�� ������ �� ����‍♀️����‍♀️����‍♀️ ��

我也使用 EncodeForXML 和 esapiEncode 对其进行了测试以确保;所有人都给我相同的结果。 我已经验证了 Lucee 中的编码设置是 UTF-8,meta charset 标签也设置为 UTF-8。我找不到任何文档 re: EncodeForHTML 说它是否对字符编码进行了任何更改,是否需要特定的字符编码,或者它是否有任何已知的表情符号或某些代码点问题。

感谢任何人提供的任何帮助或说明。

编辑:谢谢大家。希望我能接受多个答案。

在撰写本文时,ColdFusion 的最新版本是 2018 update 9

反过来,它使用 ESAPI 2.1.1

最近的发行说明没有提到表情符号,

https://github.com/ESAPI/esapi-java-legacy/tree/develop/documentation

但是他们确实在 Pull request 413 中提到了

“修复 ESAPI 无法处理非 BMP 代码点的问题。”

这可以追溯到 2017 年

https://github.com/ESAPI/esapi-java-legacy/pull/413


因此,根据所有这些信息,我建议执行以下两项操作

  1. 尝试直接使用 ESAPI。在 ESAPI 被添加到 CF 之前,这是这样做的。这个问题在 ESAPI

    中可能仍然存在,也可能不存在
  2. 与 Adob​​e 联系以更新此库。

我需要清理表情符号,以确保第三方内容与外部服务交叉兼容。一些内容包含表情符号并导致 export/import 问题。我写了一个 ColdFusion wrapper for the emoji-java 库来识别、清理和转换表情符号。

https://github.com/JamoCA/cf-emoji-java

例如,parseToAliases() 函数“用别名替换在字符串中找到的所有表情符号的 unicode”。

emojijava = new emojijava();
emojijava.parseToAliases('I like ');   // I like :pizza:

要“编码”,您可以使用 parseToHtmlDecimal() or parseToHtmlHexadecimal() functions prior to using EncodeForHTML().

emojijava = new emojijava();
test = emojijava.parseToHtmlDecimal('I like ');   // I &#10084;️ &#127829;
EncodeForHTML(test);

是的,ESAPI 2.2.0.0 解决了未正确编码非 BMP 字符的问题(参见 https://github.com/ESAPI/esapi-java-legacy/issues/300),作为 James 上面提到的 PR #413 的一部分。

但我今天早上刚刚将 ESAPI 2.2.1.0-RC1(候选发布版本 1)上传到 Maven Central,希望在下周末之前发布正式的 2.2.1.0 版本,所以如果你要投入Adobe 的一张票,用更新版本的 ESAPI 解决这个问题,我会再等一周,然后告诉他们更新到 2.2.1.0。