php中json_encode函数对中文的处理例子

 更新时间:2016年11月25日 16:19  点击:1852
json_encode处理中文会有几种情况一种是null空,一种是u80e5这种符号,还有一种就是正常的中文了,下面一聚教程小编就来给你把这些问题一种整理一篇。

json_encode这个函数作用是起到不同语言之间数据传递的作用,尤其是php对js之间数据交换十分方便。

但是json_encode这个函数在使用的时候需要注意几点:

1 所传输的数据必须是UTF8格式的

2 需要对中文做一些URLENCODE处理


json_encode中文为null解决


原因分析:使用json_encode函数应应使用utf-8编码,我的页面用的是gbk.
解决:在json_encode函数前使用iconv('gbk','utf8')函数。

 代码如下 复制代码

function gbk2utf8($data){
if(is_array($data)){
return array_map('gbk2utf8', $data);
}
return iconv('gbk','utf-8',$data);
}

这样显示出来的会是如{"item1":1,"item2":"u4e2du6587"} 格式了,虽然空解决了,但是没显示汉字呀。

我们再来分析一下

例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的。www.111cn.net
  我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文!

 代码如下 复制代码

<?php
    $testJSON=array('name'=>'中文字符串','value'=>'test');
    //echo json_encode($testJSON);
    foreach ( $testJSON as $key => $value ) {
  $testJSON[$key] = urlencode ( $value );
    }
    echo urldecode ( json_encode ( $testJSON ) );
?>

查看输出结果为:

{“name”:”中文字符串”,”value”:”test”}

到此,成功地输出了中文字符。随意使用json_encode吧。这样子在PHP后台输出的JSON字符串在前台javascript中Ajax接收后eval出来也不会出现中文乱码,因为js在处理JSON格式数据是也是以UTF8的形式进行的,与PHP类似,故接收PHP页面的JSON字符串不会出现问题。


下面是对json_encode这个函数做一些完善

 代码如下 复制代码

<?php
/**************************************************************
*
* 使用特定function对数组中所有元素做处理
* @param string &$array 要处理的字符串
* @param string $function 要执行的函数
* @return boolean $apply_to_keys_also 是否也应用到key上
* @access public
*
*************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = 0;
if (++$recursive_counter > 1000) {
die('possible deep recursion attack');
}
foreach ($array as $key => $value) {
if (is_array($value)) {
arrayRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}
 
if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
 
/**************************************************************
* www.111Cn.net
* 将数组转换为JSON字符串(兼容中文)
* @param array $array 要转换的数组
* @return string 转换得到的json字符串
* @access public
*
*************************************************************/
function JSON($array) {
arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
return urldecode($json);
}
 
$array = array
(
'Name'=>'希亚',
'Age'=>20
);
 
echo JSON($array);
?>

需要安装imagick及其php扩展。一共有二个函数,都是从网上摘下来的,还没测试,这个方案应该可行,可以简单的仿照在线文档功能,有机会在项目中实践一下

第一种

 代码如下 复制代码
/**
* PDF2PNG  
* @param $pdf  待处理的PDF文件
* @param $path 待保存的图片路径
* @param $page 待导出的页面 -1为全部 0为第一页 1为第二页
* @return      保存好的图片路径和文件名
*/
 function pdf2png($pdf,$path,$page=0)

   if(!is_dir($path))
   {
       mkdir($path,true);
   }
   if(!extension_loaded('imagick'))
   { 
     echo '没有找到imagick!' ;
     return false;
   } 
   if(!file_exists($pdf))
   { 
      echo '没有找到pdf' ;
       return false; 
   }   www.111cn.net
   $im = new Imagick(); 
   $im->setResolution(120,120);   //设置图像分辨率
   $im->setCompressionQuality(80); //压缩比
   $im->readImage($pdf."[".$page."]"); //设置读取pdf的第一页
   //$im->thumbnailImage(200, 100, true); // 改变图像的大小
   $im->scaleImage(200,100,true); //缩放大小图像
   $filename = $path."/". time().'.png';
   if($im->writeImage($filename) == true)
   { 
      $Return  = $filename; 
   } 
   return $Return; 

$s = pdf2png('file/1371273225-ceshi_ppt.pdf','images');
echo '<div align="center"><img src="'.$s.'"></div>';

第二种

 代码如下 复制代码
function pdf2png($PDF,$Path){
   if(!extension_loaded('imagick')){
       return false;
   }
   if(!file_exists($PDF)){
       return false;
   }
   $IM = new imagick();
   $IM->setResolution(120,120);
   $IM->setCompressionQuality(100);
   $IM->readImage($PDF);
   foreach ($IM as $Key => $Var){
       $Var->setImageFormat('png');
       $Filename = $Path.'/'.md5($Key.time()).'.png';
       if($Var->writeImage($Filename) == true){
           $Return[] = $Filename;
       } www.111cn.net
   }
   return $Return;
}

创建一个jpg缩略图并显示出来
 

 代码如下 复制代码
<?php
header('Content-type: image/jpeg');
$image = new Imagick('image.jpg');
// If 0 is provided as a width or height parameter,// aspect ratio is maintained
$image->thumbnailImage(100, 0);
echo $image;
?>

缩略GIF动画图片
 

 代码如下 复制代码
<?php
/* Create a new imagick object and read in GIF */
$im = new Imagick("example.gif");
/* Resize all frames */
foreach ($im as $frame) {
/* 50x50 frames */
$frame->thumbnailImage(50, 50);
/* Set the virtual canvas to correct size */
$frame->setImagePage(50, 50, 0, 0);
}/* Notice writeImages instead of writeImage */
$im->writeImages("example_small.gif", true);
?>
最近在模拟登录的时候愈发的出现登录失败的情况,原因是:微信公众平台登录如果时不时的会对一些异常帐号要求输入验证码才可以登录

这个时候平台首页的登录逻辑就会经常出现无法登录的状态,前几天写了一个抓取验证码要求用户输入,这个么有做多少代码的调整,主要是

让前端写了一写js直接调用微信公众平台的验证码连接了,发现不行,两个方面:

1、imgcode这个表单名打错了

2、在抓包的时候突然发现获取验证码的连接有设置cookie的

发现问题后这些都不是什么大事了,码码代码松松解决:


public function getImgCode($username){
 $str = $this -> getcurl()-> get("https://mp.weixin.qq.com/cgi-bin/verifycode?username=".$username."&r=".time())->execute();
 header('Content-Type:image/jpeg');
 echo $str;
    }

先用curl来请求验证码,顺便将cookie保存下来,当然这里我对curl进行了简单的封装,然后直接将输出抓取到内容,输出header头

PS:这里遇到一个问题,其实也不算什么问题,可能会经常注意不到,在测试的时候发现有一个warning错误,提示头已经发送。我就很郁闷了

直接在代码中输出呢,为什么会出现这个呢。文件也是utf-8无bom头的格式,往下一拉才发现当前这个类库中有写 ?> 这个东西,后边正好有一个空行。

其实把重点不在这里,因为就算这个文件的末尾有空行也不会提示头已经发送啊。直接分析到curl类文件中,OK,果然这个文件中又写了 ?> shit!!!

原文来自:http://www.mapenggang.com/

 

php多线程功能是php5.3才真正的支持了,下面我就尝试了pthreads功能的一个测试同时也发测试时发现了一些bug了,具体bug原因还无法解决看其它朋友有经验吗

近日用PHP处理约7k条网络数据,现有网络情况下,耗时通常一秒一条,跑完整个程序大约近两个小时。

由于跑一次数据的时间太长,因此计划通过多个线程实现并行处理,我们可以通过pthreads扩展来实现真正的多线程,而不是常见的fsockopen来“模拟”。pthreads的官网介绍在这里:http://pthreads.org/

需要注意的是,如果尝试用数组在线程间交换数据,你会失望的,因为php的数组本身不是线程安全的,正确的做法是继承Stackable类。一个简单的demo如下所示:

 代码如下 复制代码

<?php
class storage extends Stackable {
public function run(){}
}

class my extends Thread {
public function __construct($storage) {
$this->storage = $storage;
}

public function run(){
$i = 0;//www.111cn.net
while(++$i < 10) {
$this->storage[]=rand(0,1000);
}

$this->synchronized(function($thread){
$thread->notify();
}, $this);
}
}

$storage = new storage();
$my = new my($storage);
$my->start();

$my->synchronized(function($thread){
$thread->wait();
}, $my);

var_dump($storage);
?>

上例如果$storage是array,那么dump出来的将是null。

启用多线程后,跑一次数据的时间可以压缩到1000秒内,不到二十分钟,已经在我的接受范围内了

最后发现一个自动加载BUG

线程的run方法可以继承主线程的常量,函数定义。ini_set()和自动加载不能继承。
具体什么能继承什么不能继承没找到相关文档,只能自己摸索。

继承过来的函数中只能进行一些基本操作,如果试图new一个对象(比如PDO)然后返回这个对象就会导致进程意外终止。

就目前来说基本不能用于生产环境。

 

微信的api现在己经强大到可以随意调用我们网站或指定数据库的内容进行自能回复现推送消息了,现在我来给大家介绍一个我微信开的笔记。


山猫的博客,发送1,2,3,7测试相应的消息。菜单模式需要升级为服务号,或者订阅人数超过500以上。

1.用户发送的消息都是通过你提交的开发者 URL来接收。这里订阅号就可以搞定。

发送过来的都是xml格式数据,需要解析:

 代码如下 复制代码

$data = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($data)) {//接收消息并处理
$xml = (array)simplexml_load_string($data, ‘SimpleXMLElement’, LIBXML_NOCDATA);
return $xml;
}

回复也是需要返回XML的数据格式。

2.主动发送给用户消息,查询用户信息,创建自定义菜单(现在订阅号也可以用),以及一些高级功能,都是需要获取appid 和 AppSecret 以便得到 access_token

access_token 这东西,除接收信息,每个接口都要用到。access_token 的时间为 7200毫秒

过期需要重新获取。

更多请参考:http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5 额

目前我已经实现了,接收消息,自动判断回复相应消息(新闻),创建自定义菜单,点击自定义菜单后执行相应操作。用户列表之类。感觉目前开发模式和订阅模式没什么区别。。。

这里有一个测试回复的测试例子

 

 代码如下 复制代码

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "你的申请上的token");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();

class wechatCallbackapiTest
{
 public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
         $this->responseMsg();
         exit;
        }
    }

    public function responseMsg()
    {
  //get post data, May be due to the different environments
  $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

       //extract post data
  if (!empty($postStr)){
               
               $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
    $msgType = "text";
                $textTpl = "<xml>
       <ToUserName><![CDATA[%s]]></ToUserName>
       <FromUserName><![CDATA[%s]]></FromUserName>
       <CreateTime>%s</CreateTime>
       <MsgType><![CDATA[%s]]></MsgType>
       <Content><![CDATA[%s]]></Content>
       <FuncFlag>0</FuncFlag>
       </xml>";            
    if(!empty( $keyword ))
                {
                
                 $contentStr = $this->keyrep($keyword);
     if(  empty($contentStr) )
     {
      $contentStr ="你是故意的吧,没文化真可怕";//你是故意的吧,没文化真可怕;
     }
     //$contentStr = @iconv('UTF-8','gb2312',$keyword);
                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                 echo $resultStr;
     
                }else{
                 $contentStr = '没文化真可怕,居然不会打字!';//$this->keyrep($keyword);
                 //$contentStr = @iconv('UTF-8','gb2312',$keyword);
     $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                 echo $resultStr;
                }

        }else {
         echo "";
         exit;
        }
    }
  
 private function checkSignature()
 {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"]; 
          
  $token = TOKEN;
  $tmpArr = array($token, $timestamp, $nonce);
  sort($tmpArr);
  $tmpStr = implode( $tmpArr );
  $tmpStr = sha1( $tmpStr );
  
  if( $tmpStr == $signature ){
   return true;
  }else{
   return false;
  }
 }
 
 function keyrep($key)
 {
  //return $key;
  if( $key=='嗨' || $key=='在吗' || $key=='你好' ){
    $mt = mt_rand(1,17);
    $array = array(1=>'自杀中,稍后再说...',2=>'有事找我请大叫!',3=>'我正在裸奔,已奔出服务区',4=>'我现在位置:WC; 姿势:下蹲; 脸部:抽搐; 状态:用力中。。。。',5=>'去吃饭了,如果你是帅哥,请一会联系我,如果你是美女...............就算你是美女,我也要先吃饱肚子啊',6=>'
洗澡中~谢绝旁观!!^_^0',7=>'有熊出?],我去诱捕,尽快回来。',8=>'你好,我是500,请问你是250吗?',9=>'喂!乱码啊,再发',10=>'
不是我不理你,只是时间难以抗拒!',11=>'你刚才说什么,我没看清楚,请再说一遍!',12=>'发多几次啊~~~发多几次我就回你。',13=>'此人已死,有事烧纸!',14=>'乖,不急哦…',15=>'你好.我去杀几个人,很快回来.',16=>'本人已成仙?有事请发烟?佛说有烟没火成不了正果?有火没烟成不了仙。',17=>'
你要和我说话?你真的要和我说话?你确定自己想说吗?你一定非说不可吗?那你说吧,这是自动回复,反正我看不见其实我在~就是不回你拿我怎么着?'
);
   return $array[$mt];
  
  }
  
  if( $key=='靠' || $key=='啊' || $key=='阿' )
  {
    $mt = mt_rand(1,19);
    $array = array(1=>'人之初?性本善?玩心眼?都滚蛋。',2=>'今后的路?我希望你能自己好好走下去?而我  坐车',3=>'笑话是什么?就是我现在对你说的话。',4=>'人人都说我丑?其实我只是美得不明显。',5=>'A;猪是怎么死的?B;你还没死我怎么知道',6=>'
奥巴马已经干掉和他同姓的两个人?奥特曼你要小心了。 ',7=>'有的人活着?他已经死了?有的人活着?他早该死了。',8=>'"妹妹你坐船头?哥哥我岸上走"据说很傻逼的人看到都是唱出来的。',9=>'我这辈子只有两件事不会?这也不会?那也不会。',10=>'
过了这个村?没了这个店?那是因为有分店。',11=>'我以为你只是个球?没想到?你真是个球。',12=>'你终于来啦,我找你N年了,去火星干什么了?我现在去冥王星,回头跟你说个事,别走开啊',13=>'你有权保持沉默,你所说的一切都将被作为存盘记录。你可以请代理服务器,如果请不起网络会为你分配一个。',14=>'本人正在被国际刑警组织全球范围内通缉,如果您有此人的消息,请拨打当地报警电话',15=>'洗澡中~谢绝旁观!!^_^0',16=>'嘀,这里是移动秘书, 美眉请再发一次,我就与你联系;姐姐请再发两次,我就与你联系;哥哥、弟弟就不要再发了,因为发了也不和你联系!',17=>'
其实我在~就是不回你拿我怎么着?',18=>'你刚才说什么,我没看清楚,请再说一遍!',19=>'乖,不急。。。');
   return $array[$mt];
  }
  
  if( $key =='请问' )
  {
   $mt = mt_rand(1,5);
   $array = array(1=>'"我脸油吗"反光??反正我不清楚',2=>'走,我请你吃饭',3=>'此人已死,有事烧纸!',4=>'喂!什么啊!乱码啊,再发',5=>'笑话是什么??就是我现在对你说的话。');
   return $array[$mt];
  }
  
  return "";
  
 }
 
 function keylist()
 {
  $array  = array(1=>'嗨',2=>'你好',3=>'靠',4=>'在吗',5=>'请问');
 }
}

?>

[!--infotagslink--]

相关文章

  • js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20
  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • Mysql在debian系统中不能插入中文的终极解决方案

    在debian环境下,彻底解决mysql无法插入和显示中文的问题Linux下Mysql插入中文显示乱码解决方案mysql -uroot -p 回车输入密码进入mysql查看状态如下:默认的是客户端和服务器都用了latin1,所以会乱码。解决方案:mysql>use...2013-10-04
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31