通过curl往微信api接口推送微信客服消息时,如果出现乱码的情况,是因为通过json_encode方法将数组转换为 json 时,json_encode方法将 字符串 转换为了 unicode 编码。
避免出现乱码最简单的方式是在json_encode方法里加入JSON_UNESCAPED_UNICODE参数,让json_encode方法不将中文转换为unicode编码,但是,json_encode函数只有在php5.4以后的版本才支持这个参数,在某些生成环境,用的是老版本的php,没办法直接加JSON_UNESCAPED_UNICODE参数,只能用别的方法解决。
用的方法是先将字符串进行 urlencode ,然后再执行json_encode,在得到json字符串后,再urldecode一下得到最终没有乱码的字符串。
通常我们推送微信消息的时候,都是将数组转换为json,如果是一维数组,我们在用urlencode时,可以直接通过下面的代码实现:
$dataAry = [“title” => “中文标题”, “desc” => “中文描述”,”content”=>”中文正文”];
$encodeAry = array_map(‘urlencode’, $dataAry);
$jsonStr = json_encode($encodeAry);
var_dump($jsonStr);
$decodeStr = urldecode($jsonStr);
var_dump($decodeStr);
?>
但是,我们通常数组结构是多维的,也就是数组里包含有数组,这时,使用array_map(‘urlencode’,$dataAry)方法就会出错,会提示:Warning: urlencode() expects parameter 1 to be string, array given。
这时,如果是多级数组进行urlencode时,只能自己写一个方法递归进行处理了,方法内容如下:
foreach ($ary as $k => $v) { if (is_array($v)) { array_urlencode($ary[$k]); }else{ $ary[$k]=urlencode($v); } } } $dataAry = [ "article1"=>["title" => "中文标题", "desc" => "中文描述","content"=>"中文正文"], "article2"=>["title" => "中文标题", "desc" => "中文描述","content"=>"中文正文"], ]; array_urlencode($dataAry); $jsonStr = json_encode($dataAry); var_dump($jsonStr); $decodeStr = urldecode($jsonStr); var_dump($decodeStr); ?>
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~