php中json_encode UTF-8中文乱码问题

 更新时间:2016年11月25日 17:37  点击:2272
json_encode乱码出现最多的是在中文,一个是中文显示成null了,另一个是json_encode把中的uft8字符变成了全字母了,下面来给各位分析一下解决办法吧。

最近在接口代码当中用到过json_encode,在网上找到说json_encode编码设置为UTF-8中文就不会乱码,经验证这办法确实是有效果的,但是不知道为什么,代码在用过一段时间之后就不太管用了。以下是自己的解决json_encode的办法。有更好的方法请分享出来吧!

第一种:

这种简单的做一个代码转换,urlcode之后再返回所需数组

我代码这样就足够了。

 代码如下 复制代码

    public static function encodeOperations ($array)

    {

        foreach ((array)$array as $key => $value) {

            if (is_array($value)) {

                encodeOperations($array[$key]);

            } else {

                $array[$key] = urlencode(mb_convert_encoding($value,'UTF-8','GBK'));

            }

        }

        return $array;

    }

第二种:

这种是在网上看到的,然后就是有评论说会出现无限循环的问题,但是这显然很全面的,然后我测试之后也确实有,贴这里仅供参考

 代码如下 复制代码

 

     /**************************************************************

       *

       *    使用特定function对数组中所有元素做处理

       *    @param  string  &$array     要处理的字符串

       *    @param  string  $tocode     编码后

       *    @param  string  $oldcode    编码前

       *    @param  string  $function   要执行的函数

       *    @return boolean $apply_to_keys_also     是否也应用到key上

       *    @return array   $array      是否也应用到key上

       *    @access public

       *

     *************************************************************/

    function encodeOperations (&$array, $function, $tocode=false,$oldcode=false,$apply_to_keys_also = false)

    {

        foreach ($array as $key => $value) {

            if (is_array($value)) {

                encodeOperations($array[$key], $function, $apply_to_keys_also);

            } else {

                if($tocode&&$oldcode) {

                    if(function_exists(mb_convert_encoding)) {

                        $value = mb_convert_encoding($value,$tocode,$oldcode);

                }else{

                    return "error";

                }

            }

                $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]);

                }

            }

        }

        return $array;

    }

    

    /**************************************************************

     *

     *    将数组转换为JSON字符串(兼容中文)

     *    @param  array   $array      要转换的数组

     *    @return string      转换得到的json字符串

     *    @access public

     *

     *************************************************************/

    function JSON($array) {

        arrayRecursive($array, 'urlencode', true);

        $json = json_encode($array);

        return urldecode($json);

    }

对中文返回是null空的话我们需要进行字符转换成uft8或者先使用urlencode进行编译呼。

同样今天在配置 apache+php环境时折腾了很久很久,后来成功了但发现验证码图片可以生成,在登录验证时发现session为空,并没有值了,那么碰到php 验证session无效问题如何解决呢,下面一起来看看过程。

环境,我用的是apache+php环境了

如我的程序代码如下

 代码如下 复制代码

<input name="username" type="text" class="input" id="username">
<input name="password" type="password" class="input" id="password">
<input name="ver" type="text" class="input1" id="ver" size="5">
<img src="../inc/ver.php" onclick="this.src='../inc/ver.php';" />

提交之后处理文件这post.php文件

if($_SESSION['ssioner']!=$ssever){
echo("<script>alert('验证码必须由4位数字组成!');history.back();</script>");exit;  
}

结果发现一直提示验证码必须由4位数字组成,我再打印输出session

echo  $_SESSION['ssioner'];exit;

一直为空了,于时我想到了php环境配置的一个session文件目录,现在我们找到php.ini配置文件找到

upload_tmp_dir

发现这个目录是

upload_tmp_dir="D:\www.111cn.net\tp"

我检查一下我的D盘发现只有www.111cn.net文件而没有tp目录了,这样问题就找到了,于时我创建一个tp目录,重启apache发现在tp目录有sess_i40gl0p4hfep5r69j67o1k26d01文件了,这样再重新登录发现成功了。

在php中利用header直接动态显示图片时发现显示图片为一个X了,这个问题在其它浏览器没有问题,只在ie浏览器中出问题了, 那么此问题如何解决?

刚开始img.php文件跳转到文件是这样写的

header(“Location:图片的绝对网址”);

然后就发现了IE下不能显示图片,全都显示叉,而且直接在IE中输入img.php的网址,网页会跳转到图片网址,但是却提示:

HTTP Error 403. The request URL is forbidden.

错误。

修改方法就是:

header(“Location:图片的相对地址”);

原来是路径问题,分析一下如果是使用绝对地址估计header函数以为是远程不被支持了,所以改成相对路径就没问题了,其实这个我觉得是图片地址的问题哦。

<?php
header("Location: http://www.111cn.net/"); /* 重定向浏览器 */
/* 确保重定向后,后续代码不会被执行 */
exit;
?>

这样是跳转所以我们发现绝对路径是没有问题的,所以估计是地址路径错误了,本身header就支持跳转。

PHPMailer在SAE上无法发送邮件怎么回事呢,我们以前在php5.2.7版本中使用了PHPMailer是可以发,但移到sae中发现无法发邮件了,那么此问题如何解决

在SAE上直接用5.2.7之前版本的PHPMailer发送邮件会出现错误,原因在于PHPMailer默认使用stream_socket_client()来建立socket,而SAE禁用了这个函数。WordPress使用的就是5.2.7版本的PHPMailer,因此也会出现同样的问题。

解决方法很简单,修改class.smtp.php (WordPress中是wp-includes/class-smtp.php)中

$this->smtp_conn = @stream_socket_client(
$host . ":" . $port,
$errno,
$errstr,
$timeout,
STREAM_CLIENT_CONNECT,
$socket_context
);

$this->smtp_conn = fsockopen($host, $port, $errno, $errstr);
即可。

最新的5.2.8版PHPMailer已经解决了这个问题。

在fastcgi模式下上传文件比较大时都会提示mod_fcgid: HTTP request length 135024 (so far) exceeds MaxRequestLen (131072)错误了,看意思是长度限制了,下面来给各位介绍解决办法。

刚装好的apache2.4.9+php5.4,在使用phpmyadmin导入数据时出现服务器500错误。查看日志后发现

mod_fcgid: HTTP request length 135024 (so far) exceeds MaxRequestLen (131072)

意思应该是请求太长了,但以前从没见过MaxRequestLen这玩意,到httpd.conf中查找,没有;又到php.ini中查找,还是没有。只好百度,原因貌似是高版本的apache的默认请求数据改小了,也有说是fcgi运行的原因,反正不管怎么样,解决方法只有一个:

在httpd.conf中添加一条

# 修改fgci请求限制
MaxRequestLen 5242880

例子
<IfModule mod_fcgid.c>
        AddHandler    fcgid-script .fcgi
        FcgidConnectTimeout  20
        # to get around upload errors when uploading images increase the MaxRequestLen size to 15MB
        MaxRequestLen  15728640
</IfModule>

然后重启apache,就不再提示错误了。

注意:如果你只需要修改单个虚拟主机的MaxRequestLen,只需要添加到 virtualhost中就行了。如果是全局的,添加到 httpd.conf

[!--infotagslink--]

相关文章

  • php生成二维码中文乱码问题解决方法

    最近做了个扫描二维码得到vcard的项目,遇到一个问题,有一部分生成完的二维码,用android系统手机扫描后得到的vcard中的中文姓名是乱码,经过比对发现,这部分vcard中ORG这个...2016-11-25
  • js URLdecode()与urlencode方法支持中文解码

    下面来介绍在js中来利用urlencode对中文编码与接受到数据后利用URLdecode()对编码进行解码,有需要学习的机友可参考参考。 代码如下 复制代码 ...2016-09-20
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • 运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)

    今天在写一个vbs的时候,发现中文乱码,后来写好代码正常运行的代码压缩一下给了同事,发现报无效字符,经过验证后发现原来是编码的问题导致,这里就为大家分享一下...2020-06-30
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

    最近两天做项目总是被乱码问题困扰着,这不刚把mysql中文乱码问题解决了,下面小编把我的解决方案分享给大家,供大家参考,也方便以后自己查阅。首先:用show variables like “%colla%”;show varables like “%char%”;这两条...2015-11-24
  • C#读取中文文件出现乱码的解决方法

    这篇文章主要介绍了C#读取中文文件出现乱码的解决方法,涉及C#中文编码的操作技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Mysql在debian系统中不能插入中文的终极解决方案

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

    一.mysql默认不支持中文,它的server和db默认是latin1编码.所以我们要将其改变为utf-8编码,因为utf-8包含了地球上大部分语言的二进制编码 1.关闭mysql服务 sudo /etc/init.d/mysql stop 2.修改mysql配置文件 mysql配...2015-10-21
  • Windows服务器MySQL中文乱码的解决方法

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • PHP json_encode() 函数详解及中文乱码问题

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<&#63;php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
  • Java连接数据库oracle中文乱码解决方案

    这篇文章主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-16
  • 解决HttpPost+json请求---服务器中文乱码及其他问题

    这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22
  • php中iconv编码转换来解决中文乱码的问题

    用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些 代码如下 复制代码 ...2016-11-25
  • php mail发邮件标题中文乱码的问题解决办法

    本文章来给大家介绍php mail发邮件标题中文乱码的问题解决办法,希望到此类问题的朋友可进入参考。 当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码...2016-11-25
  • FlashFXP连接站点中文显示乱码解决办法

    FlashFXP是一款常用的服务器客户连接软件了,我们可以通过FlashFXP来上传或下载文件,但有一些朋友使用FlashFXP时碰到中文目录或文件名乱码问题,那么要如何来解决呢?具体就...2016-10-10
  • php中把unicode编码转化为中文

    小编在网上看到最多的就是汉字转换unicode编码了,今天我们看到一个反过来的操作就是把unicode转换成中文了,下面一起来看看 这两天帮别人开发微信平台好友板块,存...2016-11-25
  • php 判断是否是中文/英文/数字示例代码

    复制代码 代码如下: $str='asb天水市12'; if (preg_match("/^[/x7f-/xff]+$/", $str)){ echo '全部是汉字'; }else { echo '不全是汉字'; } /** PHP自带的判断是否是中文, eregi('[^/x00-/x7F]', $str ) //中文 ereg...2013-10-04
  • php json_encode值中大括号与花括号区别

    1.当array是一个从0开始的连续数组时,json_encode出来的结果是一个由[]括起来的字符串而当array是不从0开始或者不连续的数组时,json_encode出来的结果是一个由{}括起来的key-value模式的字符串复制代码 代码如下:$test...2013-10-04