2010-07-27 36 views
9

我发送json_encoded从我的PHP服务器到iPhone应用程序的数据。包含html实体的字符串(例如'&')被json_encode转义并作为&发送。让json_encode不能转义html实体

我希望做两件事情之一:

  • 使json_encode无法逃脱HTML实体。 Doc说'正常'模式不应该逃脱它,但它不适用于我。有任何想法吗?

  • 使iPhone应用程序可以廉价地避开html实体。我现在所能想到的唯一方法是涉及到一个非常昂贵的XML/HTML parser。任何更便宜的建议?

谢谢!

回答

7

PHP 5.3和PHP 5.2都不会触及HTML实体。

可以test这个用下面的代码:

<?php 
header("Content-type: text/plain"); //makes sure entities are not interpreted 
$s = 'A string with &amp; &#x6F8 entities'; 
echo json_encode($s); 

你唯一看到的PHP确实是添加字符串周围双引号。

+1

我的来源本身已经逃脱 - brainfart! – psychotik 2010-07-30 17:41:37

2

基于manual看来,json_encode不应该逃离你的实体,除非你明确地告诉它,在PHP 5.3中。你可能运行的是PHP的旧版本?

+0

是的,我使用的是5.2.6 所以前5.3 json_encode没有逃脱HTML实体默认? – psychotik 2010-07-27 18:09:42

3

json_encode不这样做。您有另一个组件正在执行HTML编码。

如果使用JSON_HEX_选项就可以避免任何<&字符出现在输出(他们会被转换到\u003C或类似的JS字符串字面转义),从而可能避免问题:

json_encode($s, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT) 

虽然这将取决于确切知道哪些字符在下游进一步被HTML编码。也许是非ASCII字符?

0

关于Artefacto的答案,我会推荐使用这个头文件,它是专门为JSON数据设计的,而不是仅仅使用纯文本。

<?php 
header('Content-Type: application/json'); //Also makes sure entities are not interpreted 
$s = 'A string with &amp; &#x6F8 entities'; 
echo json_encode($s); 

确保你看看这个职位更具体的原因要使用此内容类型,What is the correct JSON content type?