php json_encode()函数中文编码乱码解决方法

 更新时间:2016年11月25日 17:09  点击:1935
在我使用php json_encode()时,如果是英文或数字没一点问题,但是用到中文是居然出现不可识别的中文乱码了,下面看我解决json_encode中文乱码方法。

在网上找到一种解决方法:

 代码如下 复制代码
<?php
/* 处理json_encode中文乱码 */
$data = array ('game' => '冰火国度', 'name' => '刺之灵', 'country' => '冰霜国', 'level' => 45 );
echo json_encode ( $data );
echo "<br>";
$newData = array ();
foreach ( $data as $key => $value ) {
$newData [$key] = urlencode ( $value );
}
echo urldecode ( json_encode ( $newData ) );
?>

后来请教了别人,还可以用base64编码,不过base64编码不可以放在URL中,百度是这样解释的:

标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。

不过我的数据是要通过POST发送的,并不在HTTP 的head中,而在message-body里,所以不受影响。

json_encode 只能接受utf-8格式的数据


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

 代码如下 复制代码
<?php
class myClass {
public $item1 = 1;
public $item2 = '中文';
function to_json() {
//url编码,避免json_encode将中文转为unicode
$this->item2 = urlencode($this->item2);
$str_json = json_encode($this);
//url解码,转完json后将各属性返回,确保对象属性不变
$this->item2 = urldecode($this->item2);
return urldecode($str_json);
}
}
$c = new myClass();
echo json_encode($c);
echo '<br/>';
echo $c->to_json();
echo '<br/>';
echo json_encode($c);
echo '<br/>';
echo json_encode('胥');
?>

程序输出结果:

 代码如下 复制代码
{"item1":1,"item2":"u4e2du6587"}
{"item1":1,"item2":"中文"}
{"item1":1,"item2":"u4e2du6587"}
"u80e5"
在php中对数组遍历用得最多要算是foreac,while,for这几种方法了,下面我们来介绍这三种遍历数组的实现程序代码吧。

经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢?
比如:

 代码如下 复制代码
<?php$arr['laruence'] = 'huixinchen';
$arr['yahoo'] = 2007;
$arr['baidu'] = 2008;
foreach ($arr as $key => $val)
{
//结果是什么?
}

又比如:

 代码如下 复制代码

<?php
$arr[2] = 'huixinchen';
$arr[1] = 2007;$arr[0] = 2008;
foreach ($arr as $key => $val)
{
//现在结果又是什么?
}

HashTable结构示意图

, 当我们使用, each/next系列函数来遍历的时候, 也是通过移动数组的内部指针而实现了顺序遍历, 这里有一个问题, 比如:

 代码如下 复制代码

<?php
$arr = array(1,2,3,4,5);
foreach ($arr as $v) {//可以获取}
while (list($key, $v) = each($arr))

 {//获取不到}
?>

了解到我刚才介绍的知识, 那么这个问题也就很明朗了, 因为foreach会自动reset, 而while这块不会reset, 所以在foreach结束以后, pInternalPointer指向数组最末端, while语句块当然访问不到了, 解决的办法就是在each之前, 先reset数组的内部指针.

也就是说, PHP中遍历数组的顺序, 是和元素的添加先后相关的, 那么, 现在我们就很清楚的知道, 文章开头的问题的输出是:

huixinchen
2007
2008
所以, 如果你想在数字索引的数组中按照索引大小遍历, 那么你就应该使用for, 而不是foreach

 代码如下 复制代码
for($i=0,$l=count($arr); $i<$l; $i++)

{ //这个时候,不能认为是顺序遍历(线性遍历)}

 

本文章来介绍了php的新知识关于PHP中MVC框架之文件入口用法,有需要了解的朋友可以参考一下本文章。

MVC的文件入口怎么写,完全是根据程序员的引擎设计来做,也是根据程序员喜好来做,但我们的最终目的却是通过简单的代码引入引擎来处理其它的事务,就像我们要开车一样,我们首先要点火,发动机才能发动一样。在写入口之前我们需要考虑几个方面,URL解析方式,需要哪些用户参数或系统需要带入,用户参数需要更改的地方,我们需要统一用一个文件来引入,文件可以是xml,也可以的PHP,也可以是其它的想到的方法,但keheng这里用的却是php里面数组形式引入,这种形式貌似写缓存的形式,从数据库读取了数据再生成一个php文件,再require此文件即可。当然,也可以在写引擎的过程中再写入口也行,只要能达到我们的目的就行。

就我们平常见到的文件入口来看,文件入口一般分为单文件入口和多文件入口,当然也有可能有其它的文件入口没见过。

单文件入口当然是指网站访问始终都是有访问index.php这个文件,但关系到里面显示的内容却是根据后台的参数来加载,

比如:http://www.XXXX.com/index.php? Conttoller=index&action=show&id=1

这里的Conttoller就是我们需要显示的页面,通过获取Conttoller的值来确实我们的MVC加载的是哪个模型,显示的是哪个视图,一般都需要建立一个专用的路由类来进行地址的判断。action则是此模型的哪个操作,比如是显示数据,或者添加数据,或者显示文章类的,至于ID的作用是什么这里就不用说了。

多文件入口当然是指网站里面除了index.php文件名,还有其它文件访问,比如同一个网站下有index.php,about.php………..等。

但还有另外一种URL方式http://localhost/control/ index / action/1,这种方式并未指定访问这个目录下的哪个文件,一般默认的当然是index.php或者index.html,个人认为这种方式不管是程序制作或维护都较麻烦点,所以现在也很少见到有这种形式的URL,以前看过有关SEO的文章,貌似入口为这种类型的对SEO优化不太好(keheng个人愚见)。其实是不是不太好我们平常就可以观察到,比如我们百度下,随便输入一个关键词,在开头几页基本不到类似的地址被搜索出来。在SEO优化中就有一条为地址url的层级结构保持在三层内为宜。我们做WEB项目前当然要考虑到这些问题了。

以下为网上下载的一个模板的文件入口:

 代码如下 复制代码

define('UPLOAD_PATH', './Uploads/');
 
 define('VERSION', 'v2.1 Released');
 
 define('UPDATETIME', '20120323');
 
 define('APP_NAME', 'myphp');
 
 define('APP_PATH', './myphp/');
 
 define('APP_LANG', true);
 
 define('APP_DEBUG',false);
 
 define('THINK_PATH','./Core/');
 
 require(THINK_PATH.'/Core.php');

它的核心是THINK,入口指定了程序版本,更新日期等,真正的处理文件却是在Core.php文件里。由于PHP模板都是开源的,个人认为可能有些网络公司为了不让别完全搞清楚他的产品,故意在PHP代码里面多层次调用,来迷惑想学习他代码思路的程序员,让程序员跟来跟去跟的一头雾水,其实我就这样过,也可能是自己阅历不够造成的。

 代码如下 复制代码

<?php
 
          require_once './include/common.inc.php';
 
          $views->display('index.html');        
 
 ?>

加载了引擎文件后,在告诉$views类显示哪一个视图文件,这样确实是直观很多,但我个人不怎么喜欢这种方法,虽然如果修改文件模板直接在对应的文件进行修改,感觉不太好控制,而且貌$views到最后没关闭,占着内存。

 

看了些别人的入口后keheng自己也有了入口的思路。不管是单文件还是多文件,全都用这入口,总之网站根目录下文件内容全都是这个

 代码如下 复制代码

<?php
 
          require 'command/config.php';
 
          require 'command/app.php';
 
          app::run($config);
 
 ?>

实际上我的对像模型是在config.php里设置好的

 代码如下 复制代码

<?php
 
 $config['Templates'] = array(                //名称记得全转为小写
 
          ‘keheng’                              =>                                 array('keheng.php',0),
 
          ' index '                                 =>                                 array('index.php',0),
 
 );
 
 ?>

分析地址调用相应的视图,这样我就可以专门用一个文件来进行模型与视图对应设置,在用的时候即可用require 'command/config.php';加载这个数组。

可能有高人会认为这种方法貌似不太好,可能是keheng见识太少阅历不够或技术还不够,现在还没想到更好一些的方法

memory_limit这个参数我想大家看英文就知道是最大内存的问题,默认的一般是128MB如果想更大我们就得自己动手处理了,下面来看几种解决方法。

了查看这个值,你须要建树一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。

<?php phpinfo(); ?>

 

将这个脚本放到你的Web办事器上,然后在浏览器中调用它。这时你可以看到你的PHP景象设备的信息,此中有一项目组是关于“memory_limit”的, 如下图:

 

 

注:你可以用这种办法来查看php的其他参数设置,不仅仅是memory_limit

 

memory_limit应当设为几许?

 

这个完全依附于你的应用的请求。比如Wordpress,运行起核心代码须要32MB。Drupal 6则请求这个值最小为16MB,并推荐设置为32MB。若是你又安装不少的插件(plugins),尤其是那些要进行图像处理惩罚的模块,那么你可能须要128MB或更高的内存。

 

如何设置memory_limit

 

办法1: php.ini

 

最简单或常用的办法是批改php.ini

 

1.起首找到对你的网站生效的php.ini文件 因为有多个处所都可以设置php的参数,找到正确的设备文件,并进行更改是起首要做的一步。若是你上方的办法建树了php文件来查看其设备参数,则你可以找到“Loaded Configuration File”这一项,以下是个例子:

 

 

对于Linux用户,你可以经由过程履行“php -i | grep Loaded Configuration File”来找到对应的设备文件。而Windows用户,你可以测验测验批改你的php安装目次下的php.ini。

 

2.编辑php.ini 在php.ini中,找到“memory_limit”这一项,若是没有,你可以在文件的尾部本身增长这个参数。以下是一些设置典范

 

memory_limit = 128M ; 可以将128M改为任何你想设置的值

 

保存文件

 

3.重启web 办事器 若是是web办事器应用Apache, 则履行:

 

httpd restart

 

有些景象下,你可能不被容许私批改php.ini。比如若是你购买了虚拟主机办事,然则你的办事商确禁止你批改这个文件。那么,你可以须要推敲用其他办法来增长memory_limit的值。

 

办法2: .htaccess

 

申明: 这种办法只有在php以Apache模块来履行时才生效。 在你的网站的根目次下找到“.htaccess”文件,若是没有,可以本身创建一个。然后把以下设备放入此中

 

php_value memory_limit 128M ; 可以将128M改为任何你想设置的值

 

办法3: 运行时批改php的内存设置

 

在你的php代码中增长以下号令行即可。

 

ini_set(""memory_limit"",""128M"");
留言板程序需要由php +数据库来实现本教程主要是讲到了关于php mysql的留言系统的实现过程,包括增加 修改 删除及编辑工作,是对php初学才学习的好资料。

列表页面:

修改页面:

留言板的sql文件,可直接导入到mysql

 代码如下 复制代码
create database form; use form; CREATE TABLE `message` ( `id` tinyint(1) NOT NULL auto_increment, `user` varchar(25) NOT NULL, `title` varchar(50) NOT NULL, `content` tinytext NOT NULL, `lastdate` date NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=1 ;


conn.php 数据库连接文件

 代码如下 复制代码
 <?php
 $conn = @ mysql_connect("localhost", "root", "") or die("数据库链接错误");
 mysql_select_db("form", $conn);
 mysql_query("set names 'gbk'");
 ?>


add.php 根据用户提交的留言信息保存到数据库

 代码如下 复制代码

<?php
include 'conn.php';
if($_POST['submit']){
$sql="INSERT INTO message(id,user,title,content,lastdate) VALUES (NULL, '$_POST[user]', '$_POST[title]', '$_POST[content]', now())";
mysql_query($sql);
//页面跳转,实现方式为javascript
$url = "list.php";
echo "<script language='javascript' type='text/javascript'>";
echo "window.location.href='$url'";
echo "</script>"; 12 }
?>
<script type="text/javascript">
function checkPost(){
if(addForm.user.value==""){
alert("请输入用户名");
addForm.user.focus();
return false;
 }
if(addForm.title.value.length<5){
 alert("标题不能少于5个字符");
addForm.title.focus();
return false;
 }
}
 </script>
<FORM name="addForm" METHOD="POST" ACTION="add.php" onsubmit="return checkPost();">
 用户:<INPUT TYPE="text" NAME="user" /><br />
标题:<INPUT TYPE="text" NAME="title" /><br />
内容:<TEXTAREA NAME="content" ROWS="8" COLS="30"></TEXTAREA><br />
<INPUT TYPE="submit" name="submit" value="add" /></FORM>

list.php 以列表形式输出留言

 代码如下 复制代码

<?php
include 'conn.php';
?>
<?php
echo "<div align='center'><a href='add.php'>继续添加</a></div>";
?>
 <table width=500 border="0" align="center" cellpadding="5" cellspacing="1" bgcolor="#add3ef">
 <?php
$sql="select * from message order by id";
 $query=mysql_query($sql);
 while ($row=mysql_fetch_array($query)){
 ?>
 
   <tr bgcolor="#eff3ff">
   <td>标题:<font color="red"><?=$row[title]?></font> 用户:<font color="red"><?=$row[user] ?></font><div align="right"><a href="preEdit.php?id=<?=$row[id]?>">编辑</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="delete.php?id=<?=$row[id]?>">删除</a></div></td>
  </tr>
   <tr bgColor="#ffffff">
   <td>内容:<?=$row[content]?></td>
   </tr>
   <tr bgColor="#ffffff">
   <td><div align="right">发表日期:<?=$row[lastdate]?></div></td>
   </tr>
   <?php }?>
 </table>

delete.php 删除留言,根据用户提交的数据,我们以获取留言内容的ID进行删除操作

 代码如下 复制代码
 <?php include 'conn.php';
$id = $_GET['id'];
$query="delete from message where id=".$id;
 mysql_query($query); ?>
<?php //页面跳转,实现方式为javascript $url = "list.php";
echo "<script language='javascript' type='text/javascript'>"; echo "window.location.href='$url'"; echo "</script>"; ?>

preEdit.php 编辑就是利用update更新用户重新提交的数据并替换以前的记录以id为唯一标识


 

 代码如下 复制代码

<?php
 include 'conn.php';
 $id=$_GET[id];
$query="SELECT * FROM message WHERE id =".$id;
  $result=mysql_query($query);
  while ($rs=mysql_fetch_array($result)){
  ?>
 <FORM METHOD="POST" ACTION="postEdit.php">
     <input type="hidden" name="id" value="<?=$rs[id]?>">
     用户:<INPUT TYPE="text" NAME="user" value="<?=$rs[user]?>"/><br />
     标题:<INPUT TYPE="text" NAME="title" value="<?=$rs[title]?>"/><br />
     内容:<TEXTAREA NAME="content" ROWS="8" COLS="30"><?=$rs[content]?></TEXTAREA><br />
     <INPUT TYPE="submit" name="submit" value="edit"/>
 </FORM>
 <?php }?>
postEdit.php

<?php
include 'conn.php';
$query="update message set user='$_POST[user]',title='$_POST[title]',content='$_POST[content]' where id='$_POST[id]'";
mysql_query($query);
 ?>
 <?php
//页面跳转,实现方式为javascript
 $url = "list.php";
 echo "<script language='javascript' type='text/javascript'>";
 echo "window.location.href='$url'";
echo "</script>";
 ?>

总结

这是一个完整的留言板系统,只要根据上面的提示保存成文件就可以很好的实现留言功能了,留言板主要有对数据的读取,分页以及数据的删除,编辑,我们分用到sql delete,update,insert 这三种语句,相对来说是基础知识了。

 

[!--infotagslink--]

相关文章

  • 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
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • Python astype(np.float)函数使用方法解析

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

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • 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
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • 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语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25