php中json_encode中文字符乱码解决办法

一、json_encode()

这个是一个对变量进行 JSON 编码常用的函数,但是当文本的格式不是utf-8时,中文的转码会出现一些问题,比如文本为gb2312的时候

示例

 代码如下 复制代码

<?php
$jsonText = array (
 0 => array (
  'id' => '1',
  'name' => '文本1'
 ),
 1 => array (
  'id' => '2',
  'name' => '文本2'
  )
) ;
 
echo json_encode($jsonText);
//[{"id":"1","name":""},{"id":"2","name":""}]
//可以看到汉字没有被转义都为空“”,这是因为json仅仅转义encoding编码(类似于:%B0%AE),故上面语句应该先转换编码
?>

解决办法

 代码如下 复制代码

<?php
foreach ($jsonText as $key=>$value)
{
 $jsonText[$key]['name'] = urlencode($value['name']);
}
echo json_encode($jsonText);
?>
客户端处理

<script type="text/javascript">
function encodeTest(obj)
{
 $.ajax( {
  type : "GET",
  url : "< ?=$this->baseUrl?>/index/getajax",
  data : "c=" obj.value,
  success : function(json)
   {
       var json=eval(json);
       var testValue = '';
       $.each(json, function(k) {
                   testValue += decodeURI(json[k]['name']) ;
       });
 
       alert(testValue);
   }
 } )
 
}

</script>

用上面的代码js会报错 说编码不符合标准

原因是因为js 中decodeURI 仅仅支持utf8 转码。所以 ,PHP json_encode函数的代码应该为下面的代码

 代码如下 复制代码

<?php
foreach ($jsonText as $key=>$value)
{
 $jsonText[$key]['name'] = urlencode(iconv('gb2312', 'utf-8',$value['name']));
}
echo json_encode($json);
?>

查看输出结果为:

{“name”:”u4e2du6587u5b57u7b26u4e32″,”value”:”test”}

可见即使用UTF8编码的字符,使用json_encode也出现了中文乱码。解决办法是在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候在用函数urldecode()转回来。具体如下:

 代码如下 复制代码

<?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字符串不会出现问题。

时间: 2024-07-28 18:20:18

php中json_encode中文字符乱码解决办法的相关文章

phpword中文字符乱码解决办法

最近领导要求用php生成word,网上找了很多类啊,函数啊.最终相中phpword.无奈不是国人开发,对中文支持很不友好.经过研究,终于解决了中文乱码,分享出来. 1.用模板word生成word中文乱码解决方案: 打开phpword/Template.php文件,找到$replace = utf8_encode($replace);将其改为$replace =iconv('gbk', 'utf-8', $replace); 即可. 2.直接生成word文档,调用addText对象时中文乱码解决方

FlashFXP连接站点中文显示乱码解决办法

FlashFXP连接远程ftp时虽然不会影响到我们正常使用了,但是看起来也是非常的不爽的,于是就想办法来解决了了,我们知道只要是乱码就会有编码问题了,所以我觉得这个也是编码问题,我检查之后发现原因就是这些字符是utf-8编码,而windows下文件名是GBK编码.   FlashFXP中文显示乱码 现在我们在flashfxp中点击"选项->参数设" 但是没有找到,后来百度后找到解决办法,具体如下. 解决办法 打开:站点->站点管理器,选择相应的站点,然后选择高级选项,这里面

jsp cookie存入中文值乱码解决办法

解决办法原因是: 使用java.net.URLEncoder.encode()可以对要传递的中文进行编码 a.在传参数之前先把参数进行转码:java.net.URLEncoder.encode(param); 取值时用语句java.net.URLDecoder.decode(param);再转回中文 例,设置cookie  代码如下 复制代码 <%  String str = "这是中文的cookie值";  Cookie c = new Cookie("str&quo

Ubuntu Server 10.04中文环境乱码解决办法

用vim配置语言环境变量  代码如下 复制代码 vim /etc/environment 改成:  代码如下 复制代码 LANG="en_US.UTF-8″ LANGUAGE="en_US:en" sudo vim /var/lib/locales/supported.d/local 改成  代码如下 复制代码 en_US.UTF-8 UTF-8 保存后,执行命令:  代码如下 复制代码 sudo locale-gen sudo vim /etc/default/locale

vim中文出现乱码解决办法

vim乱码解决方法: 只想改当前文件的编码方式的话,只需要在命令模式下输入:  代码如下 复制代码 :set encoding=utf-8 :set fileencoding=utf-8 在根目录下新建一个.vimrc文件,在里面写上  代码如下 复制代码 let &termencoding=&encoding set fileencodings=utf-8,gbk,ucs-bom,cp936 或者找到文件.vimrc后,将下面代码加入即可: """"

invalid byte sequence in GBK(github rake generate 发布文章时字符乱码解决办法)

当我使用rake generate想生成静态页面时,提示出现编码问题: 我很确定_post目录下的markdown文件已经是无BOM的UTF-8格式了,但只要该markdown文件中包含有中文字符就会出现上面的错误. 解决方案: 找到你的Ruby安装目录,如我的是:D:\Ruby193, 在里面找到文件D:\Ruby193\lib\ruby\gems\1.9.1\gems\jekyll-0.12.0\lib\jekyll\convertible.rb 在该文件中找到下面句子: # Returns

Mac os的压缩zip文件在windows系统下打开中文文件名乱码解决办法

从mac下压缩的文件通过邮件发送过来,在windows下打开后发现乱码,和里面对应的文件夹的文件目录也发生变化 实际问题就是文件编码的问题 mac 下默认是UTF-8 而已,windows下默认是GBK 解决办法: 1.改变文件名为xx.zip 为xx.rar 2.用新版WinRAR(5.0) 以上版本直接解压即可 注: 1.用的2345好压 直接解压不能解决此文件, 2. 可以通过设置2345好压 的代码页 为UTF-8 来解压即可 (预览的时候还是乱码),不过解压出来就都正常了

Js Url传中文参数乱码解决办法

解决方法如下:   1.在JS里对中文参数进行两次转码  代码如下 复制代码 var login_name = document.getElementById("loginname").value; login_name = encodeURI(login_name); login_name = encodeURI(login_name); 2.在服务器端对参数进行解码  代码如下 复制代码 String loginName = ParamUtil.getString(request,

ajax如何传中文参数乱码解决办法

传递中文参数,然后修改数据库教程的.  代码如下 复制代码 <script> var url="admin/ajaxmodify.php?"+key+"=";  url+=encodeuricomponent(encodeuricomponent(value));   xmlhttp.open("get",url,true);   xmlhttp.send(null); </script> 参数是中文encodeurico