在 JSON 编码的 HTML5 数据属性中转义/编码单引号

Posted

技术标签:

【中文标题】在 JSON 编码的 HTML5 数据属性中转义/编码单引号【英文标题】:Escaping/encoding single quotes in JSON encoded HTML5 data attributes 【发布时间】:2012-02-08 14:11:41 【问题描述】:

php 中,我使用 json_encode()html5 数据属性中回显数组。 由于 JSON 需要 - 并且 json_encode() 生成 - 由双引号封装的值。因此,我用单引号将我的数据属性括起来,例如:

<article data-tags='["html5","jquery","php","test's"]'>

如您所见,最后一个标签(test)包含一个单引号,并且使用 json_encode() 没有选项会导致解析问题。

所以我将json_encode()JSON_HEX_APOS 参数一起使用,并且解析很好,因为我的单引号是编码的,但我想知道:这样做有缺点吗?

【问题讨论】:

你的意思是它工作的意义是不利的? 我的意思是“十六进制编码可能产生的意外副作用”的含义的缺点 你没有展示任何代码如何输出,所以答案只能是一个很好的猜测。 我的问题比具体更笼统:我想知道,一般来说,处理十六进制编码涉及什么。 @Jérémy 它应该起作用,就像,我不能不由自主地想到一个不起作用的情况,但这确实是错误的做。 HTML 转义任何可能破坏 HTML 语法的值,就这么简单。 【参考方案1】:

您需要将 HTML 转义数据回显到 HTML 中:

printf('<article data-tags="%s">',
    htmlspecialchars(json_encode(array('html5', ...)), ENT_QUOTES, 'UTF-8'));

【讨论】:

+1 始终在输出中使用适当的编码,这是唯一的方法。无效的代码点(如 \x00 需要根据 X(HT)ML 规范进行十六进制编码)。 为简单起见 htmlspecialchars(json_encode($arrayData), ENT_QUOTES,'UTF-8') i json_encode with htmlspecialchars(json_encode($arrayData), ENT_QUOTES,'UTF-8') 怎么解码?【参考方案2】:

或使用内置选项:

json_encode(array('html5', ...), JSON_HEX_APOS)

您可以在手册中查看:http://php.net/manual/en/json.constants.php#constant.json-hex-apos

【讨论】:

非常感谢。我不知道这个选项。效果很好。

以上是关于在 JSON 编码的 HTML5 数据属性中转义/编码单引号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSON 中转义特殊字符

从 django 模板中转义 JSON 数据的正确方法

django 在 json 中转义为 html

杰克逊没有在 JSON 中转义引号

如何在freemarker中转义json字符串

为啥必须在 XML 属性中转义 <?