简体   繁体   中英

getting json_encode to not escape html entities

I send json_encoded data from my PHP server to iPhone app. Strings containing html entities, like '&' are escaped by json_encode and sent as & .

I am looking to do one of two things:

  • make json_encode not escape html entities. Doc says 'normal' mode shouldn't escape it but it doesn't work for me. Any ideas?

  • make the iPhone app un-escape html entities cheaply. The only way I can think of doing it now involves spinning up a XML/HTML parser which is very expensive. Any cheaper suggestions?

Thanks!

Neither PHP 5.3 nor PHP 5.2 touch the HTML entities.

You can test this with the following code:

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

You'll see the only thing PHP does is to add double quotes around the string.

json_encode does not do that. You have another component that is doing the HTML encoding.

If you use the JSON_HEX_ options you can avoid that any < or & characters appear in the output (they'd get converted to \< or similar JS string literal escapes), thus possibly avoiding the problem:

json_encode($s, JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_QUOT)

though this would depend on knowing exactly which characters are being HTML-encoded further downstream. Maybe non-ASCII characters too?

Based on the manual it appears that json_encode shouldn't be escaping your entities, unless you explicitly tell it to, in PHP 5.3. Are you perhaps running an older version of PHP?

Going off of Artefacto's answer, I would recommend using this header, it's specifically designed for JSON data instead of just using plain text.

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

Make sure you check out this post for more specific reasons why to use this content type, What is the correct JSON content type?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM