首页 > 编程技术 > php

php怎么把unicode编码转为utf-8编码

发布时间:2016-11-25 15:37

编码转换一直是一个比较头痛的问题我们通常会因一些编码问题导致页面乱码了,下文小编整理了一个unicode编码转为utf-8编码的例子,大家一起来看看.

在前端开发中,为了让中文在不同的环境下都能很好的显示,一般是将中文转化为unicode格式,即u4f60,比如:"你好啊"的unicode编码为"u4f60u597du554a"。

JS里将中文转为unicode编码很简单。

JS代码:
function convert2Unicode(str) {
    return str.replace(/[u0080-uffff]/g,
    function($0) {
        var tmp = $0.charCodeAt(0).toString(16);
        return "u" + new Array(5 - tmp.length).join('0') + tmp;
    });
}

反转也很简单,直接alert出来或者innerHTML到dom节点里都可以。
但如果将u4f60u597du554a"字符传递给php,php就不能直接echo或者其他操作了。直接echo的话还是原生的字符,不能自动转化为中文。
php将unicode转为utf-8方法
在 php5.0及以上版本中提供了json_encode, json_decode方法。在使用json_encode变量的时候,如果变量里含有中文的话,会将中文转为unicode格式。所以在想是否可以通过 json_decode将unicode转为中文呢?实际测试发现是可以的,但对单一的字符串发现有些问题。
对于简单的字符串,发现有时候使用json_decode转的化,结果直接为空了。但将字符串替换为数组然后在转就可以了。下面为封装的代码:
php代码:
function unicode2utf8($str){
        if(!$str) return $str;
        $decode = json_decode($str);
        if($decode) return $decode;
        $str = '["' . $str . '"]';
        $decode = json_decode($str);
        if(count($decode) == 1){
                return $decode[0];
        }
        return $str;
}

使用这个方法可以很好的将unicode编码转为utf-8编码。
附上js转为实体字符和php将实体字符转为汉字的方法
js将汉字转为实体字符:
js代码:
function convert2Entity(str) {
    var len = str.length;
    var re = [];
    for (var i = 0; i < len; i++) {       
        var code = str.charCodeAt(i);         if (code > 256) {
            re.push('&#' + code + ';');
        } else {
            re.push(str.charAt(i));
        }
    }
    return re.join('');
}
php将实体字符转为utf-8汉字的方法:
php代码:
function entity2utf8onechar($unicode_c){
    $unicode_c_val = intval($unicode_c);
    $f=0x80; // 10000000
    $str = "";
    // U-00000000 - U-0000007F:   0xxxxxxx
    if($unicode_c_val <= 0x7F){         $str = chr($unicode_c_val);     }     //U-00000080 - U-000007FF:  110xxxxx 10xxxxxx     else if($unicode_c_val >= 0x80 && $unicode_c_val <= 0x7FF){         $h=0xC0; // 11000000         $c1 = $unicode_c_val >> 6 | $h;
        $c2 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2);
    }
    //U-00000800 - U-0000FFFF:  1110xxxx 10xxxxxx 10xxxxxx
    else if($unicode_c_val >= 0x800 && $unicode_c_val <= 0xFFFF){         $h=0xE0; // 11100000         $c1 = $unicode_c_val >> 12 | $h;
        $c2 = (($unicode_c_val & 0xFC0) >> 6) | $f;
        $c3 = ($unicode_c_val & 0x3F) | $f;
        $str=chr($c1).chr($c2).chr($c3);
    }
    //U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    else if($unicode_c_val >= 0x10000 && $unicode_c_val <= 0x1FFFFF){         $h=0xF0; // 11110000         $c1 = $unicode_c_val >> 18 | $h;
        $c2 = (($unicode_c_val & 0x3F000) >>12) | $f;
        $c3 = (($unicode_c_val & 0xFC0) >>6) | $f;
        $c4 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2).chr($c3).chr($c4);
    }
    //U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    else if($unicode_c_val >= 0x200000 && $unicode_c_val <= 0x3FFFFFF){         $h=0xF8; // 11111000         $c1 = $unicode_c_val >> 24 | $h;
        $c2 = (($unicode_c_val & 0xFC0000)>>18) | $f;
        $c3 = (($unicode_c_val & 0x3F000) >>12) | $f;
        $c4 = (($unicode_c_val & 0xFC0) >>6) | $f;
        $c5 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2).chr($c3).chr($c4).chr($c5);
    }
    //U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    else if($unicode_c_val >= 0x4000000 && $unicode_c_val <= 0x7FFFFFFF){         $h=0xFC; // 11111100         $c1 = $unicode_c_val >> 30 | $h;
        $c2 = (($unicode_c_val & 0x3F000000)>>24) | $f;
        $c3 = (($unicode_c_val & 0xFC0000)>>18) | $f;
        $c4 = (($unicode_c_val & 0x3F000) >>12) | $f;
        $c5 = (($unicode_c_val & 0xFC0) >>6) | $f;
        $c6 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2).chr($c3).chr($c4).chr($c5).chr($c6);
    }
    return $str;
}
function entities2utf8($unicode_c){
    $unicode_c = preg_replace("/&#([da-f]{5});/es", "entity2utf8onechar('\1')", $unicode_c);
    return $unicode_c;
}

使用方式:

$utf8chars = entities2utf8("啊你好啊");

从一个简单的理解来看在PHP中$_GET $_POST $_REQUEST都是接受数据了,get接受的是url参数而post可以说是由表单post过来的数据,而request是可以接受两者的数据,这个就是他们基础的区别所在了,下面一起来看看它们的区别证明。

PHP中有$_REQUEST与$_POST、$_GET用于接受表单数据。

一、$_REQUEST与$_POST、$_GET的区别和特点

$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比较慢。通过POST和GET方法提交的所有数据都可以通过$_REQUEST数组获得。

二、$_POST、$_GET的区别和特点

1.         GET是从服务器上获取数据,POST是向服务器传送数据。
2.         GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。POST是通过HTTP POST机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3.         对于GET方式提交表单数据,服务器端用$_GET[‘name’]获取变量的值,对于POST方式提交表单数据,服务器端用$_POST[‘name’]获取提交的数据,当然,两者都可以通过$_REQUEST[‘name’]获得表单数据。对于REQUEST方式提交表单数据,服务器端用$_REQUEST[‘name’]获取变量的值,但这种方式很少用。
4.         GET传送的数据量较小,不能大于2KB。POST传送的数据量较大,一般被默认为不受限制。但理论上,一般认为不能超过100KB。
5.         GET安全性非常低,POST安全性较高。
6.         GET表单值可以通过_GET获取;但通过action的url设置的参数总是获取不到的,<form method="get" action="a.asp?b=b">跟<form method="get"action="a.asp">是一样的,也就是说,在这种情况下,GET方式会忽略action页面后边带的参数列表。POST表单值可以通过_POST获取;但通过action的url参数设置的参数则可以不能通过_POST获取到。action=test.php?id=1这种就是GET方式传值,可以用$_REQUEST和$_GET接受传值,但不能用POST方式获取到值,即使表单是POST方式提交。所在,在提交表单时,如果action中同时有参数,最好只能通过POST表单方式,对于表单内数据,直接通过POST获取,对于action中参数,童工GET获取。
在做数据查询时,建议用GET方式,而在做数据添加、修改或删除时,建议用POST方式。
request是先读取 get再读post 的, 同时存在, 即覆盖掉前面的变量。

经典实例:

<?php
echo "get\n";
print_r($_GET);
echo "post\n";
print_r($_POST);
echo "request\n";
print_r($_REQUEST);
?>
<form method=post action='?a=1&b=2'>
<input type=text name=a value='a'>
<input type=text name=b value='b'>
<input type=submit value=test>
</form>
 
输出结果:

get:
Array
(
  [a] => 1
  [b] => 2
)
post:
Array
(
  [a] => a
  [b] => b
)
request:
Array
(
  [a] => a
  [b] => b
)
 
其实,在php配置文件php.ini中有一个设置项:variables_order = "GPCS" ,GPCS分别是GET,POST,Cookie,Server的首字母缩写,variables_order = "GPCS"含义是php文件中变量的解析顺序是GET,POST,Cookie和Server。

cookie跨域问题一直是一个大问题了,很多朋友都不知道怎么来解决就使用了json来处理了,其实还有一个更简单的办法,下面我们一起来看看吧

在setcookie 方法前,添加如下 header 即可

header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');
a.com/test

<script" width=100% src="http://b.com/get_cookie.php"></script>
//b.com/get_cookie.php
header('P3P: ........');
setcookie(...)

a.com/test 可正常获取b.com/get_cookie.php 的cookie数据

文章为各位初学php的朋友提供一篇关于php 矩阵转置 求素数 冒泡排序 选择排序例子,希望这个例子可以帮助到各位朋友哦。

关于矩阵转置:矩阵是指纵横排列的二维数据表格

关于求素数:质数公式,又称素数公式,在数学领域中,表示一种能够仅产生质数(素数)的公式。即是说,这个公式能够一个不漏地产生所有的质数,并且对每个输入的值,此公式产生的结果都是质数。由于质数的个数是可数的,因此一般假设输入的值是自然数集(或整数集及其它可数集)。迄今为止,人们尚未找到易于计算且符合上述条件的质数公式,但对于质数公式应该具备的性质已经有了大量的了解

冒泡选择排序:是两种排序方法就不介绍了

例子

 代码如下 复制代码

<?php
header("content-type:text/html;charset=utf-8");
/**
 *
 * PHP版数据结构基本算法
 * 1.矩阵转置
 * 2.求素数
 * 3.冒泡排序
 * 4.选择排序
 *//**
 * 矩阵转置
 *
 * @param array $matrix 待转置的矩阵
 * @param array return 转置后的矩阵
 * */
function transposition($matrix){
 $i=0;
 $j=0;
 foreach($matrix as $line){
  foreach($line as $element){
   $tm[$j++][$i]=$element;
  }
  $j=0;
  $i++;
 }
 return $tm;
}
$matrix=array(
 array(1,2,3,'a'),
 array(4,5,6,'b'),
 array(7,8,9,'c'),
);
echo "<br/>转置前的矩阵:";
foreach($matrix as $line){
 echo "<br/>";
 foreach($line as $value){
  echo $value."&nbsp;&nbsp;";
 }
}
$tm=transposition($matrix);
echo "<br/>转置后的矩阵:";
foreach($tm as $line){
 echo "<br/>";
 foreach($line as $element){
  echo $element."&nbsp;&nbsp;";
 }
}/**
 * 求素数
 *@param int  $n 求2~$n内的所有素数
 *@return array 返回2~$n所有的素数集合
 **/
function primenumber($n){
 $i=3;
 $prime=array(2);
 $tag=true;
 while($i<=$n){
  foreach($prime as $value){
   if($i % $value == 0){
    $tag=false;
    break;
   }
   $tag=true;
  }
  if($tag){
   $prime[]=$i;
  }
  $i++;
 }
 return $prime;
}
$n=200;
$prime=primenumber($n);
echo "<br />2~{$n}内的素数有:<br />";
foreach($prime as $value){
 echo $value."&nbsp;&nbsp;";
}/**
 * 冒泡排序
 *
 *@param array $data 待排序的数组
 *@param int $tag 0表示由小到大排序,1表示由大到小排序
 *@param array 排序后的结果
 **/
function bubblingsort($data,$tag=0){
 $arrlen=count($data);
 for($i=$arrlen-1;$i>=0;$i--){
  for($j=0;$j<$i;$j++){
   if($data[$i] > $data[$j]){
    if($tag == 1){
     $m=$data[$j];
     $data[$j]=$data[$i];
     $data[$i]=$m;
    }
   }else{
    if($tag == 0){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }
  }
 }
 return $data;
}
$data=array(34,22,2,56,90);
echo "<br/>冒泡排序前:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=bubblingsort($data);
echo "<br/>由小到大排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=bubblingsort($data,1);
echo "<br/>由大到小排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
/**
 * 选择排序
 *
 *@param array $data 待排序的数组
 *@param int $tag 0表示由小到大排序,1表示由大到小排序
 *@param array 排序后的结果
 **/
function selectsort($data,$tag=0){
 $arrlen=count($data);
 for($i=0;$i<$arrlen-1;$i++){
  for($j=$i+1;$j<$arrlen;$j++){
   if($data[$i] > $data[$j]){
    if($tag == 0){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }else{
    if($tag == 1){
     $m=$data[$i];
     $data[$i]=$data[$j];
     $data[$j]=$m;
    }
   }
  }
 }
 return $data;
}
$data=array(34,22,2,56,90);
echo "<br/>选择排序前:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=selectsort($data);
echo "<br/>由小到大排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
$data=selectsort($data,1);
echo "<br/>由大到小排序后:<br/>";
foreach($data as $value){
 echo $value."&nbsp;&nbsp;";
}
?>

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

简介

如1,2,3三个元素的全排列为:

1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1

共3*2*1=6种 3!

2公式

全排列数f(n)=n!(定义0!=1)

递归算法

1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2

这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题。所以我提出了解决方案,就是换位函数修改下
如 1 2 3 换位的话 ,不应该直接 3 2 1这样 ,让3和1直接换位; 而是让3排在最前后 ,1 2 依次向后

基本算法

以下介绍全排列算法四种:
(A)字典序法
(B)递增进位制数法
(C)递减进位制数法
(D)邻位对换法

实现全排列算法

 代码如下 复制代码

<?php

header("content-type:text/html;charset=utf-8");/**
 * @param array $a 待排列的元素集合,会动态变化
 * @param array $b 储存当前排列
 * @param array $M 待排列的元素集合,相当于一个常量,始终为初始待排列的元素集合
 */
function wholerange($a,$b,$M){
 $range=array();
 if(count($a) > 1){
  $d=$b;
  foreach($a as $value){
   $b[]=$value;
   $c=array_diff($M,$b);
   if(count($c) > 0){
    $range[]=wholerange($c,$b,$M);
   }
   $b=$d;
  }
 }elseif(count($a) == 1){
  foreach($a as $value){
   $b[]=$value;
  }
  $onerange="";
  foreach($b as $value){
   $onerange.=$value;
  }
  $range[]=$onerange;
 }
 return $range;
}
/**
 * 递归输出数组
 *
 * @param array $arr 待输出的数组
 * @return int 返回数组元素个数*/
function recursionarray($arr){
 $i=0;
 foreach($arr as $value){
  if(is_array($value)){
   $i+=recursionarray($value);
  }else{
   echo $value."<br/>";
   $i++;
  }
 }
 return $i;
}
$a=array('A','B','C','D');
$b=array();
$range=wholerange($a,$b,$a);
$count=recursionarray($range);
echo "总共有".$count."排列";
?>

标签:[!--infotagslink--]

您可能感兴趣的文章: