请问大神,我在apishop上申请了个接口,把示例代码放到我自己的页面上,打开出现乱码,请教怎么操作才能正常显示?
我是新建PHP文档直接粘贴过来。
<?php
$method = "POST";
$url = "https://api.apishop.net/common/coin/getNewsList";
$headers = NULL;
$params = array(
  "apiKey"=>"5YEv8IQ280ac9eb065dff7d204df0e921c48*********",
  "page"=>"1",
  "pageSize"=>"10"
);
$result = apishop_curl($method, $url, $headers, $params);
If ($result) {
   $body = json_decode($result["body"], TRUE);
   $status_code = $body["statusCode"];
   If ($status_code == "000000") {
       //状态码为000000, 说明请求成功
       echo "请求成功:" . $result["body"];
   } else {
       //状态码非000000, 说明请求失败
       echo "请求失败:" . $result["body"];
   }
} else {
   //返回内容异常,发送请求失败,以下可根据业务逻辑自行修改
   echo "发送请求失败";
}/**
  * 转发请求到目的主机
  * @param $method string 请求方法
  * @param $URL string 请求地址
  * @param null $headers 请求头
  * @param null $param 请求参数
  * @return array|bool
  */
function apishop_curl(&$method, &$URL, &$headers = NULL, &$param = NULL)
{
   // 初始化请求
   $require = curl_init($URL);
   // 判断是否HTTPS
   $isHttps = substr($URL, 0, 8) == "https://" ? TRUE : FALSE;
   // 设置请求方式
   switch ($method) {
       case "GET":
           curl_setopt($require, CURLOPT_CUSTOMREQUEST, "GET");
           break;
       case "POST":
           curl_setopt($require, CURLOPT_CUSTOMREQUEST, "POST");
           break;
       default:
           return FALSE;
   }
   if ($param) {
       curl_setopt($require, CURLOPT_POSTFIELDS, $param);
   }
   if ($isHttps) {
       // 跳过证书检查
       curl_setopt($require, CURLOPT_SSL_VERIFYPEER, FALSE);
       // 检查证书中是否设置域名
       curl_setopt($require, CURLOPT_SSL_VERIFYHOST, 2);
   }
   if ($headers) {
   // 设置请求头
   curl_setopt($require, CURLOPT_HTTPHEADER, $headers);
   }
   // 返回结果不直接输出
   curl_setopt($require, CURLOPT_RETURNTRANSFER, TRUE);
   // 重定向
   curl_setopt($require, CURLOPT_FOLLOWLOCATION, TRUE);
   // 把返回头包含再输出中
   curl_setopt($require, CURLOPT_HEADER, TRUE);
   // 发送请求
   $response = curl_exec($require);
   // 获取头部长度
   $headerSize = curl_getinfo($require, CURLINFO_HEADER_SIZE);
   // 关闭请求
   curl_close($require);
   if ($response) {
       // 返回头部字符串
       $header = substr($response, 0, $headerSize);
       // 返回体
       $body = substr($response, $headerSize);
       // 过滤隐藏非法字符
       $bodyTemp = json_encode(array(
            0 => $body
       ));
       $bodyTemp = str_replace("", "", $bodyTemp);
       $bodyTemp = json_decode($bodyTemp, TRUE);
       $body = trim($bodyTemp[0]);
       // 将返回结果头部转成数组
       $respondHeaders = array();
       $header_rows = array_filter(explode(PHP_EOL, $header), "trim");
       foreach ($header_rows as $row) {
           $keylen = strpos($row, ":");
           if ($keylen) {
               $respondHeaders[] = array(
                   "key" => substr($row, 0, $keylen),
                   "value" => trim(substr($row, $keylen + 1))
               );
           }
       }
       return array(
           "headers" => $respondHeaders,
           "body" => $body
       );
   } else {
       return FALSE;
   }
}
?>

解决方案 »

  1.   

    得到的是 json,需要用 json_decode 解码
      

  2.   

    从接口中接收到的json数据打印或者写入文件的话中文会转成unicode编码,如果后续使用的话,直接json_decode($result["body"], true);解析出来的中文不会有影响,正常使用。
    如果是真想输出到控制台看数据内容或者是想记录日志便于查询的话,可以这样$temp=json_decode($result["body"], true);  echo  json_decode($temp, JSON_UNESCAPED_UNICODE); 输出查看(前提是你的PHP版>= 5.4.0)。
    我做了个例子可以看到差别,控制台输出log日志:taif -f 日志可以看到区别:
      

  3.   


     不好意思这里写错了,应该是echo  json_encode($temp, JSON_UNESCAPED_UNICODE);
      

  4.   

     json_decode 解码 请问需要怎么写?
      

  5.   


     不好意思这里写错了,应该是echo  json_encode($temp, JSON_UNESCAPED_UNICODE);加了这段代码后 确实实现转码成功了,不过需要怎么操作这个php文件只出现中文?
    现在是这样
      

  6.   

    不知道你要做什么!
    ajax 的核心组件(Microsoft.XMLHTTP、XMLHttpRequest)总是以 utf-8 字符集进行传输的,且浏览器会将传入的任何字符集统一转换成 unicode 字符集
    json 中的 \uxxxx 就是 unicode 字符集的 html 编码的字面表示(\u 是声明其后的内容是 unicode 字符的十六进制表示)
      

  7.   


     不好意思这里写错了,应该是echo  json_encode($temp, JSON_UNESCAPED_UNICODE);加了这段代码后 确实实现转码成功了,不过需要怎么操作这个php文件只出现中文?
    现在是这样

    在json的RFC4627文件https://tools.ietf.org/html/rfc4627已经说明了
    JSON包含4种基础类型(字符串,数字,布尔和null)和两种结构类型(对象和数组)
    字符串是一个由零或者多个Unicode字符组成的序列。至于为什么是Unicode字符集,这是因为Unicode包含了世界所有的文字(也叫万国码)。只有接收者拿到unicode字符指定相应的编码方式如utf-8,gbk等才能转换成想看到的文字。从接口中获得的json就是没处理的unicode字符,不处理的话是看不到中文的。
      

  8.   


    <?phpfunction safeEncoding($string, $outEncoding = 'UTF-8') {
        $encoding = "UTF-8";
        for ($i = 0; $i < strlen($string); $i++) {
            if (ord($string{$i}) < 128)
                continue;
            if ((ord($string{$i}) & 224) == 224) {
                //第一个字节判断通过 
                $char = $string{++$i};
                if ((ord($char) & 128) == 128) {
                    //第二个字节判断通过 
                    $char = $string{++$i};
                    if ((ord($char) & 128) == 128) {
                        $encoding = "UTF-8";
                        break;
                    }
                }
            }
            if ((ord($string{$i}) & 192) == 192) {
                //第一个字节判断通过 
                $char = $string{++$i};
                if ((ord($char) & 128) == 128) {
                    //第二个字节判断通过 
                    $encoding = "GB2312";
                    break;
                }
            }
        }    if (strtoupper($encoding) == strtoupper($outEncoding))
            return $string;
        else
            returniconv($encoding, $outEncoding, $string);
    }
    ?>
    <?php
    $method = "POST";
    $url = "https://api.apishop.net/common/coin/getNewsList";
    $headers = NULL;
    $params = array(
      "apiKey"=>"5YEv8IQ280ac9eb065dff7d204df0e921c4820751e1997e",
      "page"=>"1",
      "pageSize"=>"10"
    );
    $result = apishop_curl($method, $url, $headers, $params);
    If ($result) {
       $body = json_decode($result["body"], TRUE);
       $status_code = $body["statusCode"];
       If ($status_code == "000000") {
           //状态码为000000, 说明请求成功
           echo "请求成功:" . $result["body"];
       } else {
           //状态码非000000, 说明请求失败
           echo "请求失败:" . $result["body"];
       }
    } else {
       //返回内容异常,发送请求失败,以下可根据业务逻辑自行修改
       echo "发送请求失败";
    }/**
      * 转发请求到目的主机
      * @param $method string 请求方法
      * @param $URL string 请求地址
      * @param null $headers 请求头
      * @param null $param 请求参数
      * @return array|bool
      */
    function apishop_curl(&$method, &$URL, &$headers = NULL, &$param = NULL)
    {
       // 初始化请求
       $require = curl_init($URL);
       // 判断是否HTTPS
       $isHttps = substr($URL, 0, 8) == "https://" ? TRUE : FALSE;
       // 设置请求方式
       switch ($method) {
           case "GET":
               curl_setopt($require, CURLOPT_CUSTOMREQUEST, "GET");
               break;
           case "POST":
               curl_setopt($require, CURLOPT_CUSTOMREQUEST, "POST");
               break;
           default:
               return FALSE;
       }
       if ($param) {
           curl_setopt($require, CURLOPT_POSTFIELDS, $param);
       }
       if ($isHttps) {
           // 跳过证书检查
           curl_setopt($require, CURLOPT_SSL_VERIFYPEER, FALSE);
           // 检查证书中是否设置域名
           curl_setopt($require, CURLOPT_SSL_VERIFYHOST, 2);
       }
       if ($headers) {
       // 设置请求头
       curl_setopt($require, CURLOPT_HTTPHEADER, $headers);
       }
       // 返回结果不直接输出
       curl_setopt($require, CURLOPT_RETURNTRANSFER, TRUE);
       // 重定向
       curl_setopt($require, CURLOPT_FOLLOWLOCATION, TRUE);
       // 把返回头包含再输出中
       curl_setopt($require, CURLOPT_HEADER, TRUE);
       // 发送请求
       $response = curl_exec($require);
       // 获取头部长度
       $headerSize = curl_getinfo($require, CURLINFO_HEADER_SIZE);
       // 关闭请求
       curl_close($require);
       if ($response) {
           // 返回头部字符串
           $header = substr($response, 0, $headerSize);
           // 返回体
           $body = substr($response, $headerSize);
           // 过滤隐藏非法字符
           $bodyTemp = json_encode(array(
                0 => $body
           ));
           $bodyTemp = str_replace("", "", $bodyTemp);
           $bodyTemp = json_decode($bodyTemp, TRUE);
           $body = trim($bodyTemp[0]);
           // 将返回结果头部转成数组
           $respondHeaders = array();
           $header_rows = array_filter(explode(PHP_EOL, $header), "trim");
           foreach ($header_rows as $row) {
               $keylen = strpos($row, ":");
               if ($keylen) {
                   $respondHeaders[] = array(
                       "key" => substr($row, 0, $keylen),
                       "value" => trim(substr($row, $keylen + 1))
                   );
               }
           }
           return array(
               "headers" => $respondHeaders,
               "body" => $body
           );
       } else {
           return FALSE;
       }
    }
    $temp=json_decode($result["body"], true); echo  json_encode($temp, JSON_UNESCAPED_UNICODE);?>
    我把代码全部贴上来,@xuzuning  @coding8424  帮我看看要怎么写?
      

  9.   

    并没有什么问题header('Content-type: text/html;charset=utf-8');function safeEncoding($string, $outEncoding = 'UTF-8') {
        $encoding = "UTF-8";
        for ($i = 0; $i < strlen($string); $i++) {
            if (ord($string{$i}) < 128)
                continue;
            if ((ord($string{$i}) & 224) == 224) {
                //第一个字节判断通过 
                $char = $string{++$i};
                if ((ord($char) & 128) == 128) {
                    //第二个字节判断通过 
                    $char = $string{++$i};
                    if ((ord($char) & 128) == 128) {
                        $encoding = "UTF-8";
                        break;
                    }
                }
            }
            if ((ord($string{$i}) & 192) == 192) {
                //第一个字节判断通过 
                $char = $string{++$i};
                if ((ord($char) & 128) == 128) {
                    //第二个字节判断通过 
                    $encoding = "GB2312";
                    break;
                }
            }
        }    if (strtoupper($encoding) == strtoupper($outEncoding))
            return $string;
        else
            returniconv($encoding, $outEncoding, $string);
    }/**
      * 转发请求到目的主机
      * @param $method string 请求方法
      * @param $URL string 请求地址
      * @param null $headers 请求头
      * @param null $param 请求参数
      * @return array|bool
      */
    function apishop_curl(&$method, &$URL, &$headers = NULL, &$param = NULL)
    {
       // 初始化请求
       $require = curl_init($URL);
       // 判断是否HTTPS
       $isHttps = substr($URL, 0, 8) == "https://" ? TRUE : FALSE;
       // 设置请求方式
       switch ($method) {
           case "GET":
               curl_setopt($require, CURLOPT_CUSTOMREQUEST, "GET");
               break;
           case "POST":
               curl_setopt($require, CURLOPT_CUSTOMREQUEST, "POST");
               break;
           default:
               return FALSE;
       }
       if ($param) {
           curl_setopt($require, CURLOPT_POSTFIELDS, $param);
       }
       if ($isHttps) {
           // 跳过证书检查
           curl_setopt($require, CURLOPT_SSL_VERIFYPEER, FALSE);
           // 检查证书中是否设置域名
           curl_setopt($require, CURLOPT_SSL_VERIFYHOST, 2);
       }
       if ($headers) {
       // 设置请求头
       curl_setopt($require, CURLOPT_HTTPHEADER, $headers);
       }
       // 返回结果不直接输出
       curl_setopt($require, CURLOPT_RETURNTRANSFER, TRUE);
       // 重定向
       curl_setopt($require, CURLOPT_FOLLOWLOCATION, TRUE);
       // 把返回头包含再输出中
       curl_setopt($require, CURLOPT_HEADER, TRUE);
       // 发送请求
       $response = curl_exec($require);
       // 获取头部长度
       $headerSize = curl_getinfo($require, CURLINFO_HEADER_SIZE);
       // 关闭请求
       curl_close($require);
       if ($response) {
           // 返回头部字符串
           $header = substr($response, 0, $headerSize);
           // 返回体
           $body = substr($response, $headerSize);
           // 过滤隐藏非法字符
           $bodyTemp = json_encode(array(
                0 => $body
           ));
           $bodyTemp = str_replace("", "", $bodyTemp);
           $bodyTemp = json_decode($bodyTemp, TRUE);
           $body = trim($bodyTemp[0]);
           // 将返回结果头部转成数组
           $respondHeaders = array();
           $header_rows = array_filter(explode(PHP_EOL, $header), "trim");
           foreach ($header_rows as $row) {
               $keylen = strpos($row, ":");
               if ($keylen) {
                   $respondHeaders[] = array(
                       "key" => substr($row, 0, $keylen),
                       "value" => trim(substr($row, $keylen + 1))
                   );
               }
           }
           return array(
               "headers" => $respondHeaders,
               "body" => $body
           );
       } else {
           return FALSE;
       }
    }
    ?>
    <?php
    $method = "POST";
    $url = "https://api.apishop.net/common/coin/getNewsList";
    $headers = NULL;
    $params = array(
      "apiKey"=>"5YEv8IQ280ac9eb065dff7d204df0e921c4820751e1997e",
      "page"=>"1",
      "pageSize"=>"10"
    );
    $result = apishop_curl($method, $url, $headers, $params);
    If ($result) {
       $body = json_decode($result["body"], TRUE);
       $status_code = $body["statusCode"];
       If ($status_code == "000000") {
           //状态码为000000, 说明请求成功
           //echo "请求成功:";// . $result["body"];
       } else {
           //状态码非000000, 说明请求失败
           echo "请求失败:" . $result["body"];
       }
    } else {
       //返回内容异常,发送请求失败,以下可根据业务逻辑自行修改
       echo "发送请求失败";
    }$temp=json_decode($result["body"], true); 
    echo  json_encode($temp, JSON_UNESCAPED_UNICODE);?>
    {"statusCode":"000000","desc":"请求成功","result":{"newsList":[{"title":"日本金融厅公布虚拟货币交易所中期检查报告","content":"今日日本金融厅公布虚拟货币交易所中期检查报告。报告中称,虚拟货币交易所总资产规模与上一财年相比迅速扩大,平均增幅553%。去年秋季以来业务扩张迅速,内部管理系统的维护没有跟上。在未来的监督对策方面,日本金融厅表示,对已注册交易所,将改进并持续更新风险分析方法,继续进行现场检查和深度监测,一旦确认问题存在,将采取必要的行政手段。日本金融厅补充称,未来将继续与自律组织、国内外相关政府部门展开合作。","updateTime":"2018-08-10 17:33:23"},{"title":"全球首个区块链健身生态亮相纳斯达克大屏","content":"据每日经济报道,近日全球首个区块链健身生态项目BodyOne登陆纽约时代广场纳斯达克大屏,BodyOne将于8月28日上线FCoin等区块链交易所。这位来自中国的健身行业区块链新贵的高调亮相证明了其在健身行业垂直领域进军区块链4.0时代的雄心壮志。","updateTime":"2018-08-10 17:09:46"},{"title":"赛迪研究院、链塔智库将联合发布中国区块链百强榜","content":"近日,工信部下属赛迪区块链研究院、链塔智库和中国区块链生态联盟正在开展中国区块链企业综合竞争力评估工作,并将于近期推出中国区块链企业百强榜","updateTime":"2018-08-10 16:46:25"},{"title":"嘉楠耘智区块链事业部负责人:区块链正在从概念向实际行业渗透","content":"8月10日,在2018纷智金融科技峰会(香港)上,嘉楠耘智区块链事业部负责人、比升资本创始人邵建良表示,加密货币行业迭代速度很快,区块链正逐渐从概念向行业渗透。邵建良称,区块链不是针对某些人的机会,而是可以带来普适性机会。他认为,好的区块链项目一定满足「方向+团队+共识+社区+技术+顾问+投资」的人员配置结构。在操作层面,一个人想进入区块链行业,首先需要做一些功课,比如研读白皮书、看行业报告;另外,要有空杯心态和自我思辨能力,可以实现个人观念的破旧立新。只有这样,未来才能在区块链行业走得更远。","updateTime":"2018-08-10 16:35:10"},{"title":"SBI集团与平安集团建立合资公司 将中国金融科技引入日本","content":"据MONEYzine报道,日本金融巨头SBI控股集团与中国平安保险股份有限公司(平安集团)的全资子公司安科技术,平安集团子公司上海壹账通金融科技设立合资子公司。出资比例SBI控股集团60%、平安集团40%。\r\n\r\n\r\n\r\n至2017年底,壹账通金融科技已向468家银行和1890个金融机构提供金融科技“SaaS平台”。具体来说,平安集团采用能读取面部微表情的生物测定技术、AI、区块链以及云技术,服务于于金融机关的销售扩大、强化风险管理、改善顾客服务等方面。该公司已于2018年初开始向香港及东盟各国银行提供服务。\r\n\r\nSBI控股集团通过该合资公司,将向向日本国内金融机构推进壹账通金融科技的该系列服务,同时也希望通过与平安集团的合作能够为日本国内金融机构进入中国市场做出贡献。","updateTime":"2018-08-10 16:28:35"},{"title":"李笑来:流量对区块链领域影响不大","content":"据网易科技报道,李笑来表示,他赚的最多的钱跟粉丝量一点没有关系。“我在区块链世界里赚的这么多的钱,跟流量半毛钱关系没有。这么多钱哪儿来的,就是持有比特币到现在,我没有粉丝它也涨,我有粉丝它还涨”。","updateTime":"2018-08-10 16:17:20"},{"title":"泛非银行调查报告:非洲36国广泛接受数字货币,但监管方面多为观望","content":"据Bitcoin.com报道,泛非银行Ecobank Transnational发布的报告中显示,尽管数字货币在36个非洲国家金融活动中占据重要位置,但只有南非和斯威士兰政府采取了“普遍有利和宽容的态度”。报告指出,“与世界上许多其他地区一样,非洲据政府和中央银行在监管加密货币方面大多采用'观望'方式。””许多非洲政府和监管机构都认识到数字货币的风险和潜在的积极影响“,并且一些非洲政府已经表现出“对加密货币与基础区块链技术之间差异的认识”。","updateTime":"2018-08-10 15:58:36"},{"title":"雄岸基金姚勇杰:区块链是价值互联网+全球版的纳斯达克","content":"8月10日,雄岸基金姚勇杰表示,区块链是价值互联网+全球版的纳斯达克。他认为区块链的发展过程是基础设施和落地应用交替推动的过程,区块链不是一个单纯的独立技术,它让技术不再为垄断服务,区块链有望构建更加公平、公正、公信、共享的世界。","updateTime":"2018-08-10 15:57:10"},{"title":"新加坡风投公司为加密货币和区块链初创企业设立1000万美元基金","content":"路透社消息,新加坡风投公司Golden Gate Ventures今日宣布将为加密货币和区块链初创企业设立LuneX Ventures基金,规模为1000万美元。","updateTime":"2018-08-10 15:50:52"},{"title":"工信部印发推动企业上云实施指南,提出利用区块链等新技术培育平台经济","content":"金融界消息,工信部印发《推动企业上云实施指南(2018-2020年)》,提出鼓励各地加快推动开展云上创新创业。支持各类企业和创业者以云计算平台为基础,利用大数据、物联网、人工智能、区块链等新技术,积极培育平台经济、分享经济等新业态、新模式。","updateTime":"2018-08-10 15:34:54"}],"pageNow":"1","pageSize":"10","itemCount":10647}}