Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 721
psychotik Avatar asked Jul 27 '10 17:07

psychotik


3 Answers

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.

like image 160
Artefacto Avatar answered Oct 24 '22 22:10

Artefacto


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 \u003C 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?

like image 36
bobince Avatar answered Oct 24 '22 21:10

bobince


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?

like image 26
kander Avatar answered Oct 24 '22 21:10

kander