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

32

在 PHP 中,我使用 json_encode() 将数组输出到 HTML5 数据属性中。 由于 JSON 要求值用双引号括起来,而 json_encode() 生成的值也是这样。因此,我将我的数据属性用单引号括起来,例如:

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

可以看到,最后一个标签(test)包含单引号,在不使用任何选项的情况下使用json_encode()会导致解析问题。

因此,我使用带有JSON_HEX_APOS参数的json_encode(),解析正常,因为我的单引号已被编码,但我想知道:这样做是否有缺点?


你的意思是它能够正常工作的缺点? - hakre
1
我的意思是“十六进制编码可能产生的意外副作用”的缺陷。 - Jérémy F.
你没有展示任何代码是如何输出内容的,因此答案只能是一个猜测。 - hakre
我的问题比较普遍而不是具体的:我想知道,一般来说,处理十六进制编码需要哪些步骤。 - Jérémy F.
1
@Jérémy,它“应该”可以工作,也就是说,我无法想到任何可能导致它不起作用的情况,但这确实是错误的做法。HTML转义任何可能破坏您的HTML语法的值,就这么简单。 - deceze
一些字符需要进行十六进制编码,因为在HTML/XML中没有这些字符的表示形式,甚至没有实体。对于你提出的字符串不是这种情况(存在实体而不会破坏属性值),但在其他情况下,需要使用JavaScript十六进制编码来传输值,以便在X(HT)ML文档中保持完整。请参见http://www.w3.org/TR/REC-xml/#charsets。 - hakre
2个回答

59
您需要对输出到HTML中的数据进行HTML转义:

您需要对输出到HTML中的数据进行HTML转义:

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

+1 总是使用适当的编码进行输出,这是唯一可行的方法。无效的代码点(例如\x00)需要按照X(HT)ML规范进行十六进制编码。 - hakre
为了简单起见,htmlspecialchars(json_encode($arrayData), ENT_QUOTES,'UTF-8') - zainengineer
使用 htmlspecialchars_decode() 函数解码,然后使用 json_decode() 函数解析 JSON 数据。 - SNS

13

1
非常感谢。我不知道这个选项。它运行得非常好。 - Paul Etienney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接