PHP json_encode 中文处理类实例

 更新时间:2016年11月25日 15:42  点击:2197
中文处理在php中处理总是不那么完美经常会碰到中文处理时乱码或为空问题,下面我在处理json时也碰到同样的问题,后来整理一个完美解决 json_encode 中文乱码或为空程序类。
 代码如下 复制代码

/**************************************************************
    *
    * 使用特定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--;
    }
    /**************************************************************
    *
    * 将数组转换为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'=>24
    );
    
    
    echo JSON($array);
在服务器中301与302对于搜索引擎来讲一个是永久的跳新的地址了,一个是告诉你暂时到了一个新地址了,那么我们在php中怎么实现301永久重定向和302临时重定向呢,下面我们一起来看看方法的实现程序。


实现重定向的原理很简单,就是Web服务器返回个HTTP header给浏访问者,PHP发送HTTP header这个功能是由header()函数来实现的。301, 302, 404 这些状态码是在HTTP协议中约定好的,所以不用打破沙锅问“为什么是301而不是3001”。扯多了,回到正题。

PHP 301重定向:

 代码如下 复制代码

header('HTTP/1.1 301 Moved Permanently'); 

Header( "Location: http://www.111cn.net/" ); 

exit();

或者

 代码如下 复制代码

    <?php
    //301永久重定向

    $http_protocol = $_SERVER['SERVER_PROTOCOL'];   //http协议版本

    //如果是其他协议,则默认为HTTP/1.0
    if ( 'HTTP/1.1' != $http_protocol && 'HTTP/1.0' != $http_protocol )
        $http_protocol = 'HTTP/1.0';

    //响应301状态码
    header("$http_protocol 301 Moved Permanently");

    //指定重定向的URL
    $new_url = 'http://www.111cn.net/';
    header("Location:$new_url");
    ?>

PHP 302重定向:

 代码如下 复制代码

header("Location: http://www.hzhuti.com/"); 

exit();

顺到把PHP 404错误也附带上:

 代码如下 复制代码

header("HTTP/1.1 404 Not Found"); 

exit();

这里关于php 301与302重定向就讲到了这里了,下面附一下apache做法

例:

APACHE

 代码如下 复制代码

Redirect 301 /old/old.htm http://www.111cn.net/new.htm
Redirect permanent /one http://111cn.net/two
RedirectMatch 301 (.*).gif$ http://www.111cn.net/images/$1.jpg


2.使用mod_rewrite重写URL方式

APACHE

 代码如下 复制代码

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^111cn.net
RewriteRule ^(.*)$ http://www.111cn.net/$1 [R=permanent,L]

关于apache htaccess这里就不介绍人了与mod_rewrite重写URL方式几乎是完全一样的哦。

这里我整理了一些常用的ip地址api第三方jsonp接口了,像淘宝的这里就找到了,如果有找到的朋友在下面留方加上,我将补充上来。

腾讯IP地址查询接口:http://fw.qq.com/ipaddress
新浪IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
搜狐IP地址查询接口:http://pv.sohu.com/cityjson
谷歌IP地址查询接口:http://j.maxmind.com/app/geoip.js
有道IP地址查询接口:http://www.youdao.com/smartresult-xml/search.s
1616 IP地址查询接口:http://w.1616.net/chaxun/iptolocal.php
126 http://ip.ws.126.net/ipquery
hao123 http://app.hao123.com/ipquery/getcity.php?rtype=2

下面我看一下测试腾讯IP地址aip

腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress

返回的是数据格式为:

 代码如下 复制代码

var IPData = new Array(“58.218.198.205″,”",”江苏省”,”徐州市”);

使用JS代码进行调取:

 代码如下 复制代码

<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"></script>
<script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>

新浪IP地址查询接口返回的为

 代码如下 复制代码

var remote_ip_info = {"ret":1,"start":"123.68.0.0","end":"123.68.195.255","country":"u4e2du56fd","province":"u6e56u5357","city":"u957fu6c99","district":"","isp":"u94c1u901a","type":"","desc":""};

搜狐IP地址查询接口

 代码如下 复制代码

var returnCitySN = {"cip": "123.68.122.147", "cid": "430000", "cname": "湖南省"};

好了其它的我就不介绍了大家自行操作吧。

ip黑名单实现方法是先把要过滤的IP放在一个txt文件或数据库中,然后当我们访问时获取我们的IP地址然后进行遍历对比即可实现了。


学校的新闻系统要求有些新闻只开放校内ip浏览,于是重写了一个代码来实现此功能,实现后的结果是,只要把允许访问的ip列入ip.txt这个文件中即可,同时支持c类ip,例如:

ip.txt
192.168
211.67.188
211.67.191.25
代码如下:

 代码如下 复制代码

/*
* ip地址黑名单、白名单
* 判断访客地址的ip是否在ip.txt中,支持c类ip
* By xhat
*/

$ip = $_SERVER['REMOTE_ADDR'];
$ipArray = preg_replace("#rn?|n#","",file('ip.txt'));
foreach ($ipArray as $ipTest) {
if (substr_count($ip, $ipTest) != "0") {
echo "ok"; //执行相关命令
die();
}
}

?>

上面大家可以使用代码来骗过了,下面代码进行升级

 代码如下 复制代码

<?php
class block_ip {
var $Block_ip = array("192.168.1.1","210.10.2.1-20","222.34.4.*");
function __construct(){
}
function __destruct(){
}
private function makePregIP($str){
if (strstr($str,"-")) {
$aIP = explode(".",$str);
foreach ($aIP as $k=>$v) {
if (!strstr($v,"-")) {
$preg_limit .= makePregIP($v);
} else{
$aipNum = explode("-",$v);
for($i=$aipNum[0];$i<=$aipNum[1];$i++){
$preg .=$preg?"|".$i:"[".$i;
}
$preg_limit .=strrpos($preg_limit,".",1)==(strlen($preg_limit)-1)?$preg."]":".".$preg."]";
}
}
}else{
$preg_limit .= $str.".";
}
return $preg_limit;
}
private function getAllBlockIP(){
if ($this->Block_ip) {
foreach ($this->Block_ip as $k=>$v) {
$ipaddres = $this->makePregIP($v->start_ip);
$ip = str_ireplace(".",".",$ipaddres);
$ip = str_replace("*","[0-9]{1,3}",$ip);
$ipaddres = "/".$ip."/";
$ip_list[] = $ipaddres;
}
}
return $ip_list;
}
public function checkIP() {
$iptable = $this->getAllBlockIP();
$IsJoined = true;
//取得用户ip
$Ip = $this->get_client_ip();
$Ip = trim($Ip);
//剔除黑名单中的IP区段
if ($iptable) {
foreach($iptable as $value) {
if (preg_match("{$value}",$Ip)) {
$IsJoined = false;
break;
}
}
}
// www.111cn.net如果在ip黑名单中就执行如下操作
if( !$IsJoined ){
echo "IP Error";
exit;
}
}
private function get_client_ip(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return($ip);
}
}
?>

引用片段:

 代码如下 复制代码

$oBlock_ip = new block_ip();
$oBlock_ip->checkIP();

在php中要下载图片的第一步我需要利用正则来采集字符串中的图片地址,然后再利用php相关函数把图片直接读取并保存到本地服务器即实现了图片批量下载了。

最近一直很忙,遇到一个手工活,需要下载一些远程的图片,一共一百多张,如果通过手工一张一张的保存,也太耗费时间了,于是上网google了一把,找到PHP批量下载图片文件的方法,原文是出自平凡世界博客的一片关于如何使用PHP批量下载CSS文件中的图片的文章。经过研究改写了一下就可以使用了,方便快捷多了。

PHP批量下载图片文件代码:

 代码如下 复制代码

set_time_limit(0);//设置PHP超时时间
$imagesURLArray = array_unique($imagesURLArray );

foreach($imagesURLArray as $imagesURL) {
    echo $imagesURL;
    echo "
";
    file_put_contents(basename($imagesURL), file_get_contents($imagesURL));
}

原理很简单,通过一个含有图片地址的数组循环,然后使用PHP的file_get_contents函数取得图片,在使用file_put_contents函数把图片保存下来。
P.S:一定要加上设置PHP超时时间哦~!

附上原文中通过php下载css中图片的代码:

 代码如下 复制代码

< ?php
/*
More & Original PHP Framwork
Copyright (c) 2007 - 2008 IsMole Inc.
Author: kimi
Documentation: 下载样式文件中的图片,水水专用扒皮工具
*/

//note 设置PHP超时时间
set_time_limit(0);

//note 取得样式文件内容
$styleFileContent = file_get_contents('images/style.css');

//note 匹配出需要下载的URL地址
preg_match_all("/url((.*))/", $styleFileContent, $imagesURLArray);

//note 循环需要下载的地址,逐个下载
$imagesURLArray = array_unique($imagesURLArray[1]);
    foreach($imagesURLArray as $imagesURL) {
    file_put_contents(basename($imagesURL), file_get_contents($imagesURL));
}


后来又找到一个php批量下载图片文件

假如现在我现在发现一个网站上的图片保存方式是1001 – 1999目录下都存放着从1开始(数量不等)的.jpg图片,现在我决定用php的方法将图片按照自己需要的样式直接下载到本地

假如图片开始地址为:http://image.xxx.com/img/1001/1.jpg
这时我将1001处放到变量$id,1.jpg放到变量$num.jpg,保存的文件名为$id_$num.jpg
首先确保在此文件执行目录下面建一个名为img的并且可写的文件夹

 代码如下 复制代码
<?php
$id= isset($_GET['id']) && intval($_GET['id']) && $_GET['id']>1000 ? $_GET['id'] : 1001;
$num= isset($_GET['num']) && intval($_GET['num']) ? $_GET['num'] : 1;
$url="http://image.xxx.com/img/{$id}/{$num}.jpg";
 
$array=get_headers($url,1);
 
//通过返回200和400来判断是增加$id或者$num
if(preg_match('/200/',$array[0])){
 $new_url="?id={$id}&num=".($num+1);
 
 ob_start();
 readfile($url);
 $img = ob_get_contents();
 ob_end_clean();
 
 $filename="./img/{$id}_{$num}.jpg";
 $f=fopen($filename,'a');
 fwrite($f,$img);
 fclose($f);
}else{
 $new_url="?id=".($id+1)."&num=1";
}
if($id > 1999) exit('全部完成');
//显示当前的状态
echo $url,' - ',$array[0],'<script>location.href="'.$new_url.'";</script>';
[!--infotagslink--]

相关文章

  • 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
  • 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)

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

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

    我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
  • 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
  • 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
  • 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
  • three.js显示中文字体与tween应用详析

    这篇文章主要给大家介绍了关于three.js显示中文字体与tween应用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-04
  • JavaScript过滤字符串中的中文与空格方法汇总

    这篇文章主要介绍了JavaScript过滤字符串中的中文与空格方法汇总 的相关资料,需要的朋友可以参考下...2016-03-09
  • php中文转换成拼音代码

    <?php教程 function cn2pinyin($_string, $_code='gb2312') { $_datakey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|b...2016-11-25
  • php 根据啊拉伯数字转变成大写中文数字

    // 原是是根据用户输入的数字判断再转换成想要的大写数字,如果我们先把大小写存在一个数组,再判断进行转换就OK了。 $data = $_POST['rmb']; if (!ereg("^[0-9.]",$dat...2016-11-25
  • javascript另类方法实现htmlencode()与htmldecode()函数实例分析

    这篇文章主要介绍了javascript另类方法实现htmlencode()与htmldecode()函数,结合实例形式分析了javascript字符编码与解码操作的相关技巧,需要的朋友可以参考下...2016-11-22