【问题标题】:json decode of url request which contain special character包含特殊字符的url请求的json解码
【发布时间】:2014-08-02 12:05:38
【问题描述】:

我有一个这样的 url 请求:

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['data']);exit;

输出是:

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

表示它正在从# 字符开始。
(旁注:我正在为 iphone 开发 api,所以请求来自 iphone,框架:CI)

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

【问题讨论】:

  • Hashtag无法通过Get参数发送。
  • 我不知道,iphone 开发者如何发送数据。但我可以使用$_REQUEST 获得它。
  • @sriraman 可以,只要urlencode()ded

标签: php json


【解决方案1】:

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

您需要对 URL 进行正确的 URL 编码才能使其正常工作。

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

%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

【讨论】:

    【解决方案2】:

    您正在以某些并非真正必要的方式操纵$datahtmlspecialchars()htmlentities() 如果应用于特定值 - 而不是整个 JSON,则有意义。危险是他们弄乱了JSON,这里只对urldecode()很重要!

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

    这个already works 并没有遗漏任何字符。

    如果你打算发布一些内容并想逃避它,你可以这样做

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

    【讨论】:

    • 哎呀对不起..它坏了。我使用$data = urlencode($_REQUEST['data']); print_r($data);exit;如果我删除#那么它正在工作。
    • 编码是否正确(如user2428118所建议的那样)?
    • 实际上请求来自 iPhone,所以我不知道。我正在尝试在服务器端修复。
    • @DS9 您可以将请求粘贴到您的问题中,var_dump($_REQUEST['data']); 并查看源代码
    【解决方案3】:

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

    【讨论】:

    • 请求来自iphone,所以无法替换。
    • 谁说这个 char 将是唯一没有通过该过程的字符?同样在正确的设置系统中,这应该不是问题
    猜你喜欢
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2012-12-24
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多