PHP Unicode编码相互转换的例子

 更新时间:2016年11月25日 15:34  点击:2074
Unicode编码我们用到的不多因为Unicode编码在源码中都是字符了,但有时会用到Unicode编码了,下面我们一起来看一篇PHP Unicode编码相互转换的例子,希望例子能够对各位有帮助。
<?php
/**
* $str 原始中文字符串
* $encoding 原始字符串的编码,默认utf-8
* $prefix 编码后的前缀,默认"&#"
* $postfix 编码后的后缀,默认";"
*/
function unicode_encode($str, $encoding = 'utf-8', $prefix = '&#', $postfix = ';') {
    //将字符串拆分
    $str = iconv("UTF-8", "gb2312", $str);
    $cind = 0;
    $arr_cont = array();
    for ($i = 0; $i < strlen($str); $i++) {
        if (strlen(substr($str, $cind, 1)) > 0) {
            if (ord(substr($str, $cind, 1)) < 0xA1) { //如果为英文则取1个字节 
                array_push($arr_cont, substr($str, $cind, 1));
                $cind++;
            } else {
                array_push($arr_cont, substr($str, $cind, 2));
                $cind+=2;
            }
        }
    }
    foreach ($arr_cont as &$row) {
        $row = iconv("gb2312", "UTF-8", $row);
    }
    //转换Unicode码
    foreach ($arr_cont as $key => $value) {
        $unicodestr.= $prefix . base_convert(bin2hex(iconv('utf-8', 'UCS-4', $value)), 16, 10) .$postfix;
    }
    return $unicodestr;
}
/**
* $str Unicode编码后的字符串
* $decoding 原始字符串的编码,默认utf-8
* $prefix 编码字符串的前缀,默认"&#"
* $postfix 编码字符串的后缀,默认";"
*/
function unicode_decode($unistr, $encoding = 'utf-8', $prefix = '&#', $postfix = ';') {
    $arruni = explode($prefix, $unistr);
    $unistr = '';
    for ($i = 1, $len = count($arruni); $i < $len; $i++) {
        if (strlen($postfix) > 0) {
            $arruni[$i] = substr($arruni[$i], 0, strlen($arruni[$i]) - strlen($postfix));
        }
        $temp = intval($arruni[$i]);
        $unistr .= ($temp < 256) ? chr(0) . chr($temp) : chr($temp / 256) . chr($temp % 256);
    }
    return iconv('UCS-2', $encoding, $unistr);
}
$str = "PHP二次开发:www.php2.cc";
$unistr = unicode_encode($str);
$unistr2 = unicode_decode($unistr);
echo $unistr . '<br />';
echo $unistr2 . '<br />';
$unistr = unicode_encode($str,'GBK','\\u');
$unistr2 = unicode_decode($unistr,'GBK','\\u');
echo $unistr . '<br />';
echo $unistr2 . '<br />';

本文章为各位介绍解决yii webservice 提示:Procedure 'getSent' not present 错误方法,有兴趣的和小编一起看看。


其实根据常用的webservice清除缓存方法,在client端加入这样一句话:

ini_set("soap.wsdl_cache_enabled", "0");

应该就可以了,但是处理了好久,在本地测试没问题,放到服务器上就不行,一直提示:Procedure 'getSent' not present

后来查看PHP的配置文件php.ini,找到这样一句话: soap.wsdl_cache_dir="/tmp"

然后进入对应目录,看到有这样子的文件:

wsdl-root-37c8f47f71a35a60f667be40ae619d0b

wsdl开头的文件,都是webservice的缓存文件,删掉这些文件,再试,一切正常了。

php 防止表单重复提交的方法我相信各位在网上可以找到许多的例子,在这里小编为各位整理了一些常用的方法并且非常的有效了,希望对各位有帮助。

用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。

1.使用客户端脚本

<form method="post" name="register" action="test.php" enctype="multipart/form-data">  

<input name="text" type="text" id="text" />  

<input name="cont" value="提交" type="button" onClick="document.register.cont.value='正在提交,请等待...';document.register.cont.disabled=true;document.the_form.submit();">  

</form>


当用户单击“提交”按钮后,该按钮将变为灰色不可用状态
上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。

还有一个方法,也是利用JavaScript的功能,但是使用的是OnSubmit()方法,如果已经提交过一次表单,将立即弹出对话框,代码如下:

<script language="javascript">  

    var submitcount=0;  

    function submitOnce (form){  

        if (submitcount == 0){  

             submitcount++;  

             return true;  

        } else{  

            alert("正在操作,请不要重复提交,谢谢!");  

            return false;  

        }  

    }  

    </script>  

    <form name="the_form" method="post" action="" onSubmit="return submitOnce(this)">  

    <input name="text" type="text" id="text" />  

    <input name="cont" value="提交" type="submit">  

    </form>

在上例中,如果用户已经单击“提交”按钮,该脚本会自动记录当前的状态,并将submitcount变量自加1,当用户试图再次提交时,脚本判断submitcount变量值非零,提示用户已经提交,从而避免重复提交表单。


2. 使用session(这个与JSP处理方法是一样的)

利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交。
A页面的代码:

<?php  
   session_start();                //根据当前SESSION生成随机数  
   $code = mt_rand(0,1000000);  
   $_SESSION['code'] = $code;      //将此随机数暂存入到session  
   ?>  
   <form id="form1" name="form1" method="post" action="t2.php">  
       <p>说明 <input type="text" name="titile" />  
           <input type="hidden" name="originator" value="<?php echo $code;?>"></p>  
       <p><input type="submit" name="Submit" value="提交" /></p>  
   </form>
B页面:
<?php  
session_start();  
if(isset($_POST['originator'])) {  
    if($_POST['originator'] == $_SESSION['code']){  
        echo "ok";  
        unset($_SESSION["code"]);               //将其清除掉此时再按F5则无效  
    }else{  
        echo "请不要刷新本页面或重复提交表单";  
    }  
}?>

PHP 7新特性有那些?PHP 7新特性主要是在性能上提升了不少了,我们可以不使用php加速插件只要使用PHP 7即可达到加速性能了,真是这样吗?我们来看看PHP 7新特性有哪些。


PHP 7在性能方面的突破成为近来最热门的话题之一,目前官方PHP 7.0.0 Beta 2已经发布
新特性
性能提升:PHP 7要比PHP 5.6快两倍
全面一致的64位支持
移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展
新增了空接合操作符(??)【wiki】

$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

新增加了结合比较运算符(<=>)【wiki】

$a = 1;
$b = 2;
 
switch ($a  <=> $b)
{
    case 1:
        echo "a > b";
        break;
    case 0:
        echo "a == b";
        break;
    case -1:
        echo "a < b";
        break;
}

新增加了函数的返回类型声明【wiki】

function foo(): array {
    return [];
}

新增加了标量类型声明【wiki】

//标量声明的主要作用是自动实现参数的强制类型转换
//变量类型声明(int, float, string , bool)
function add(int $a, int $b): int {
    return $a + $b;
}

新增加匿名类【wiki】

class Foo {}
$child = new class extends Foo {};
var_dump($child instanceof Foo); // true

可捕获致命错误,较早版本只能通过register_shutdown_function()事后处理。(wiki)

Benchmark
测试代码:
$count = $argv[1];
 
$a = array();
for ($i = 0; $i < $count; $i++) {
    $a[$i] = $i;
}
 
foreach ($a as $i) {
    array_key_exists($i, $a);
}

测试效果如下

可见PHP 7相对于PHP 5.4有数倍以上的速度提升。


社区中的Benchmark结果:


以WordPress开源博客首页为测试场景的测试结果:

HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key/Value 数据库来做数据的持久化存储

HTTPSQS(HTTP Simple Queue Service)是一个基于HTTP GET/POST请求的简单队列服务。

PHP队列服务HTTPSQS的安装和使用


PHP队列服务HTTPSQS的安装和使用

队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。利用消息队列可以很好地异步处理数据传送和存储, 当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取消息队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等,也就是实现异步请求。

HTTPSQS 具有以下特征:

● 非常简单,基于 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支持HTTP协议的编程语言均可调用。
● 非常快速,入队列、出队列速度超过10000次/秒。
● 高并发,支持上万的并发连接,C10K不成问题。
● 支持多队列。
● 单个队列支持的最大队列数量高达10亿条。
● 低内存消耗,海量数据存储,存储几十GB的数据只需不到100MB的物理内存缓冲区。
● 可以在不停止服务的情况下便捷地修改单个队列的最大队列数量。
● 可以实时查看队列状态(入队列位置、出队列位置、未读队列数量、最大队列数量)。
● 可以查看指定队列ID(队列点)的内容,包括未出、已出的队列内容。
● 查看队列内容时,支持多字符集编码。
● 源代码不超过800行,适合二次开发。

HTTPSQS使用示例:

//生成对账单
public function create_dzd()
{
    $sl_id = I('get.sl_id','','intval');
    $sl_uid = I('get.sl_uid','','intval');
 
    $this->send_task->startTrans();//开启事务
 
    $data['st_params'] = $sl_id;
    $data['st_seller_id'] = $sl_uid;
    $data['st_type'] = 3;
    $data['st_add_time'] = time();
    $data['st_success'] = 1;//1后台生成对账单
    $data['st_is_compelete'] = 0;
    $data['st_ip'] = get_client_ip(1);
    $id = $this->send_task->add($data);
    if($id){
        $httpsqs = $this->getHttpsqs();
        $name = self::EXPORT_RECORD;
        $rs = $httpsqs->put($name, $id);
        if($rs){
            $this->send_task->commit();
            $this->ajaxReturn(array('code'=>0, 'msg'=>'已经开始生成!'));
        }else{
            $this->send_task->rollback();
            $this->ajaxReturn(array('code'=>2, 'msg'=>'生成对账单失败'));
        }
    }else{
        $this->ajaxReturn(array('code'=>3, 'msg'=>'生成对账单失败'));
    }
}

这就是一个队列的应用,生成对账单,入队列,同时把记录写入到一张表记录。另一个java脚本读取队列,进行处理,更新记录。

HTTPSQS封装在一个类中,调用的时候这样调用:


//初始化队列服务
private function getHttpsqs()
{
    import("COM.Httpsqs");
    $httpsqs = new Httpsqs("192.168.1.8", 1218, "dafadsfasfsadfsa", 'utf-8');
    return $httpsqs;
}
但是要使用HTTPSQS,必须有一台队列服务器,这个服务器装了队列服务。

以上初始化队列,也指定了ip,端口,来连接队列服务器,才能进行队列的操作。

HTTPSQS服务器端安装方法:


ulimit -SHn 65535
 
wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz
tar zxvf libevent-2.0.12-stable.tar.gz
cd libevent-2.0.12-stable/
./configure --prefix=/usr/local/libevent-2.0.12-stable/
make
make install
cd ../
 
wget http://httpsqs.googlecode.com/files/tokyocabinet-1.4.47.tar.gz
tar zxvf tokyocabinet-1.4.47.tar.gz
cd tokyocabinet-1.4.47/
./configure --prefix=/usr/local/tokyocabinet-1.4.47/
#注:在32位Linux操作系统上编译Tokyo cabinet,请使用./configure --enable-off64代替./configure,可以使数据库文件突破2GB的限制。
#./configure --enable-off64 --prefix=/usr/local/tokyocabinet-1.4.47/
make
make install
cd ../
 
wget http://httpsqs.googlecode.com/files/httpsqs-1.7.tar.gz
tar zxvf httpsqs-1.7.tar.gz
cd httpsqs-1.7/
make
make install
cd ../
更具体的服务器端HTTPSQS队列服务的安装和编译,参考:https://code.google.com/p/httpsqs/

[!--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
  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • Javascript类型转换的规则实例解析

    这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
  • 美图秀秀把普通照片快速转换成卡通效果教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下把普通照片快速转换成卡通效果的教程,各位想知道具体制作步骤的使用者们,那么下面就快阿里跟着小编一起看一...2016-09-14
  • VSCode 配置uni-app的方法

    这篇文章主要介绍了VSCode 配置uni-app的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • vscode安装git及项目开发过程

    这篇文章主要介绍了vscode安装git及项目开发过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-19
  • Vscode上使用SQL的方法

    这篇文章主要介绍了Vscode上使用SQL的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-26
  • PHP json_encode() 函数详解及中文乱码问题

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式。<&#63;php$arr = array ( 'Name'=>'希亚', 'Age'...2015-11-08
  • vscode搭建STM32开发环境的详细过程

    这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
  • 浅析C#数据类型转换的几种形式

    本篇文章是对C#中数据类型转换的几种形式进行了详细的分析介绍,需要的朋友参考下...2020-06-25
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • JavaScript实现Base64编码转换

    这篇文章主要介绍了JavaScript实现Base64编码转换的相关资料,非常简单实用,需要的朋友可以参考下...2016-04-25
  • PHP编码转换函数mb_convert_encoding与iconv用法

    文章来实现一个PHP编码转换函数mb_convert_encoding与iconv用法,希望例子能帮助到各位。 将一个短信接口代码从apache迁移到nginx+php-fpm后,发现无法发出短信了,查...2016-11-25
  • c#入门之类型转换详解

    这篇文章主要介绍了c#的类型转换详解,类型转换分两种形式:隐式转换、显示转换,下面是详细介绍...2020-06-25
  • JavaScript实现数据类型的相互转换

    这篇文章主要为大家详细介绍了JavaScript实现数据类型的相互转换,感兴趣的朋友可以参考一下...2016-03-09
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • 浅谈Vue开发人员的7个最好的VSCode扩展

    这篇文章主要介绍了浅谈Vue开发人员的7个最好的VSCode扩展,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20