包含特殊字符的url请求的json解码

时间:2014-06-12 08:30:07

标签: php json

我有这样的网址请求:

http://localhost/pro/api/index/update_profile?data={"id":"51","name":"abc","address":"stffu fsagu asfhgui fsahgiu3#$@^^@#%^3 6\"\"wkgforqf\";rqgjrg..,,,rqwgtr''qwrgtrw'trwqt'rqwtqwr trqt\n"}

我正在尝试对这个url进行json解码。我使用以下代码来解码url。如果url不包含特殊字符,它的工作正常。但如果它包含特殊字符,如何解码它。

    $string = htmlspecialchars($_REQUEST['data'], ENT_QUOTES);
    $jsonFix = urldecode($string);
    $string = htmlentities($jsonFix, ENT_QUOTES | ENT_IGNORE, "UTF-8");
    $json = json_decode($string, true);
    print_r($json);exit;

我尝试了这段代码,但它无法正常工作。当我尝试以下内容时:

  

的print_r($ _ REQUEST [ '数据']);出口;

输出是:

  

{“id”:“51”,“name”:“ds”“,”address“:”stffu fsagu asfhgui fsahgiu3

表示它来自#字符 (旁注:我正在为iphone工作,所以请求来自iphone,框架:CI)

那么如何获取包含特殊字符的url以及如何解码它?

3 个答案:

答案 0 :(得分:3)

The # character marks the beginning of the fragment part of the URL.

您需要对网址进行正确的网址编码才能实现此目的。

例如,正确进行URL编码后,您的JSON将变为:

%7B%22id%22%3A%2251%22%2C%22name%22%3A%22abc%22%2C%22address%22%3A%22stffu%20fsagu%20asfhgui%20fsahgiu3%23%24%40%5E%5E%40%23%25%5E3%206%5C%22%5C%22wkgforqf%5C%22%3Brqgjrg..%2C%2C%2Crqwgtr%27%27qwrgtrw%27trwqt%27rqwtqwr%20trqt%5Cn%22%7D

整个网址变为:

http://localhost/pro/api/index/update_profile?data=%7B%22id%22%3A%2251%22%2C%22name%22%3A%22abc%22%2C%22address%22%3A%22stffu%20fsagu%20asfhgui%20fsahgiu3%23%24%40%5E%5E%40%23%25%5E3%206%5C%22%5C%22wkgforqf%5C%22%3Brqgjrg..%2C%2C%2Crqwgtr%27%27qwrgtrw%27trwqt%27rqwtqwr%20trqt%5Cn%22%7D

查看所选语言的文档,找到URL编码字符的正确方法。

例如,在PHP中,这是rawurlencode,而在JavaScript中,这是encodeURIComponent

如有必要,网上还有很多网址编码器,例如this website

答案 1 :(得分:1)

您正在以某些方式操纵$data,这些方式并非真正必要。如果应用于特定值,则htmlspecialchars()htmlentities()有意义 - 而不是整个JSON。危险在于他们搞砸了JSON,这对urldecode()来说非常重要!

$jsonFix = urldecode($data);
$json = json_decode($jsonFix, true);

already works并且不会留下任何角色。

如果您计划发布某些内容并想要逃避它,您可以这样做

htmlspecialchars($json['address'], ENT_QUOTES)

答案 2 :(得分:-1)

你不能用“& hashtagChar”之类的东西替换“#”字符吗?在你处理之前,然后把它放回去?