PHP中对汉字进行unicode编码和解码的实现方法

 更新时间:2017年7月6日 23:49  点击:2486
小编推荐的这篇文章介绍了PHP中对汉字进行unicode编码和解码的实现方法,非常实用,有兴趣的同学可以参考一下。

 

 代码如下复制代码

//将内容进行UNICODE编码

functionunicode_encode($name)

{

  $name= iconv('UTF-8','UCS-2',$name);

  $len=strlen($name);

  $str=''

  for($i= 0;$i<$len- 1;$i=$i+ 2)

  {

    $c=$name[$i];

    $c2=$name[$i+ 1];

    if(ord($c) > 0)

    { // 两个字节的文字

      $str.='\u'.base_convert(ord($c), 10, 16).base_convert(ord($c2), 10, 16);

    }

    else

    {

      $str.=$c2;

    }

  }

  return$str;

}

$name='MY,你大爷的'

$unicode_name=unicode_encode($name);

echo'

'.$unicode_name.'

'

// 将UNICODE编码后的内容进行解码

functionunicode_decode($name)

{

  // 转换编码,将Unicode编码转换成可以浏览的utf-8编码

  $pattern='/([\w]+)|(\\\u([\w]{4}))/i'

  preg_match_all($pattern,$name,$matches);

  if(!empty($matches))

  {

    $name=''

    for($j= 0;$j<count($matches[0]);$j++)

    {

      $str=$matches[0][$j];

      if(strpos($str,'\\u') === 0)

      {

        $code=base_convert(substr($str, 2, 2), 16, 10);

        $code2=base_convert(substr($str, 4), 16, 10);

        $c=chr($code).chr($code2);

        $c= iconv('UCS-2','UTF-8',$c);

        $name.=$c;

      }

      else

      {

        $name.=$str;

      }

    }

  }

  return$name;

}

echo'MY,\u4f60\u5927\u7237\u7684 -> '.unicode_decode($unicode_name);

 

小编推荐的这篇文章介绍了用PHP将Unicode 转化为UTF-8的实现方法,非常实用,有兴趣的同学快来看看吧。
 代码如下复制代码

functionunescape($str) {

  $str= rawurldecode($str);

  preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);

  $ar=$r[0];

  //print_r($ar);

  foreach($aras$k=>$v) {

    if(substr($v,0,2) =="%u"){

      $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,-4)));

 }

    elseif(substr($v,0,3) =="&#x"){

      $ar[$k] = iconv("UCS-2BE","UTF-8",pack("H4",substr($v,3,-1)));

 }

    elseif(substr($v,0,2) =="&#") {

        

      $ar[$k] = iconv("UCS-2BE","UTF-8",pack("n",substr($v,2,-1)));

    }

  }

  returnjoin("",$ar);

}

echounescape("紫星蓝");

今天有用户反馈,表单系统用户提交的数据中文会乱码。测试发现问题出在 iconv 转换上。
iconv('UCS-2',
'GBK',
'中文')
Google

搜索发现,原因是 Linux 服务器上 UCS-2 编码方式与 Winodws 不一致。

于是,我改成

 iconv('UCS-2BE',
'GBK',
'中文')
 试试,中文正常了

以下是有关两个平台

UCS-2 编码的潜规则:

1、 UCS-2 不等于 UTF-16。UTF-16 每个字节使用 ASCII 字符范围编码,而 UCS-2 对每个字节的编码可以超出 ASCII 字符范围。UCS-2 和 UTF-16 对每个字符至多占两个字节,但是他们的编码是不一样的。

2、对于 UCS-2, windows 下默认是 UCS-2LE。用 MultibyteToWidechar(或者A2W)生成的是 UCS-2LE 的 unicode。windows记事本可以将文本保存为 UCS-2BE,相当于多了层转换。

3、 对于 UCS-2, linux 下默认是 UCS-2BE。用iconv(指定UCS-2)来转换生成的是 UCS-2BE 的 unicode。如果转换windows平台过来的 UCS-2, 需要指定 UCS-2LE。

4、鉴于windows和linux等多个平台对 UCS-2 的理解不同(UCS-2LE,UCS-2BE)。MS  主张 unicode 有个引导标志(UCS-2LE FFFE, UCS-2BE FEFF),以表明下面的字符是 unicode 并且判别  big-endian 或 little-endian。 所以从 windows 平台过来的数据发现有这个前缀,不用慌张。

5、 linux 的编码输出,比如从文件输出,从 printf 输出,需要控制台做适当的编码匹配(如果编码不匹配,一般和该程序编译时的编码有若干关系),而控制台的转换输入需要查看当前的系统编码。比如控制台当前的编码是  UTF-8, 那么 UTF-8 编码的东西能正确显示,GBK 就不能;同样,当前编码是 GBK, 就能显示 GBK  编码,后来的系统应该更智能的处理好更多的转换了。不过通过 putty 等终端还是需要设置好终端的编码转换以解除乱码的烦恼。

小编推荐的这篇文章介绍了php 常用的系统函数,非常实用,有兴趣的同学快来看看吧。

字符串函数

strlen:获取字符串长度,字节长度

substr:字符串截取,获取字符串(按照字节进行截取)

strchr:与substr相似,从指定位置截取一直到最后

strrchr(获取文件后缀名):与strchr一样,只是从右边开始查找字符

strtolower:所有的字符都小写(针对英文字母)

strtoupper:所有的字符都大写

strrev:字符串反转(只能反转英文:英文存储只有一个字节),按照字节进行反转

strpos:从字符串中找对应字符出现的位置(数字下标),从最左边开始找

strrpos:与strpos一样,只是从字符串的右边开始找

trim:去掉函数两边的字符,默认是空格

时间日期函数

time:得到当前时间的时间戳(整型:从格林威治时间1970年1月1日0时0分0秒开始)秒数

date:时间序列化函数,将指定的时间戳转换成规定时间日期的显示格式(随意的字符串:有专业的格式符规定),如果没有指定时间戳,系统默认使用当前时间的时间戳

strtotime:时间日期格式的字符串转换成对应的时间戳(只要是正确的英语时间表达方式,都可以进行转换)

microtime:微秒时间戳,根据不同的要求返回不同的结果 混合 microtime (布尔类型 ),可以返回一个浮点数的时间,也可以返回一个数组(时间戳和微秒数)

数学相关函数

abs:绝对值

floor:向下取整 floor(3.2) 结果等于3

ceil:向上取整

round:四舍五入

rand:取得一个指定范围内的随机整数

mt_rand:取得一个指定范围内的随机整数(效率更高)

数组相关函数

key:获取当前数组当前指针所指向的元素的下标

current:获取的当前指针指向元素的数值

next:获取下一个元素的值,并且将指针下移

prev:获取上一个元素的值,并且将指针上移

end :将指针移到数组的最后一个元素,并返回最终指针位置的值

reset:将指针移到数组的第一个元素,返回最终指针位置的值

array_keys:获取一个数组的所有键名,返回一个索引数组

array_values:获取一个数组的所有值,返回一个索引数组

explode:爆炸,将一个字符串按照某个指定的规则(通常是特殊字符),将数组分成多个段,每一段都当做一个数组的元素,返回一个索引数组

implode:粘合,将一个数组内部的所有元素按照某个指定的规则(特殊字符),将所有的元素拼接成一个字符串

array_merge:合并,指的是将两个数组中的元素进行累计。如果后面的数组与前面的数组有下标(键名:关联)相同的,那么后面的元素的值会覆盖前面的;如果是索引的相同下标,会自动的修改下标叠加到前面的数组里。

数据结构模拟函数

array_shift:从数组的前面弹出元素,得到元素的值

array_pop:从数组的后面弹出元素,获得元素的值

array_unshift:从数组的前面压入元素,得到当前数组元素的个数

array_push:从数组的后面压入元素,得到当前数组元素的个数

判断变量

is_bool:判断是否是布尔类型

is_float:判断浮点型

is_integer:判断整型

is_object:判断对象

is_array:判断数组

is_string:判断字符串

is_resource:判断资源

is_scalar:scalar是标量的,判断是基本数据类型:整型,浮点型,布尔型和字符串型

is_null:是否为空

is_numeric:判断数字或者纯数字组成的字符串

gettype:获得数据类型

settype:改变数据类型

文件操作函数

opendir(路径):打开一个路径资源(将路径内部的所有数据读入到内存)

readdir(路径资源):从文件夹资源中读取当前资源指针所指向的文件的名字,指针会向下移动一位

closedir(资源):释放对应的文件资源

scandir(路径):读取一个路径内部的所有文件名,返回一个数组,数组的每一个元素都是文件名。

file_exists:判断一个文件是否存在(文件是广义:路径和文件)

is_dir:判断一个指定路径是否存在(文件夹)

is_file:判断一个指定路径是否是文件(文件)

mkdir:创建一个路径,如果路径存在就会报错

rmdir:移除文件夹

file_get_contents:从一个指定的文件内读取数据内容。

file_put_contents:将指定的字符串写入到对应的文件

fopen:打开一个文件资源

fgetc:c代表character,一次读取一个字符

fgets:s代表string,代表可以读取多个字符,取决于指定的读取长度或者是否碰到换行(最多只能读取一行数据)

两个函数都是对当前资源指针进行操作,读取之后都会将指针下移

fread:获取指定长度的数据直到文件结束

fwrite:向文件资源指针所在的位置写入数据,写东西不会将当前位置已有的东西往后移,而是会覆盖

fseek:将指针指定到对应的位置

fclose:使用对应的文件资源

copy:复制

unlink:删除文件

rename:重命名文件

filemtime:m代表modify,文件最后被修改的时间

filesize:文件大小(字节)

fileperms:文件权限(Linux下的八进制)

[!--infotagslink--]

相关文章

  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23
  • Python 利用base64库 解码本地txt文本字符串

    这篇文章主要介绍了Python 利用base64库 解码本地txt文本字符串的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-09
  • PHP翻页跳转功能实现方法

    我们都知道用php+mysql在web 页实现数据库资料全部显示是非常简单而有趣的,数据库资料很少的情况下页面显示还是让人满意的,但是当数据库资料非常多的情况下,页面的显示情况将会变的非常糟糕,下面就来介绍一下如何实现当...2015-11-08
  • 网页自动调用国内双核浏览器的极速模式的实现方法

    由于国内好几个浏览器都是双核浏览器(蛋痛,做一个浏览器壳就说国产,而且使用率高),有时打开网页会出现不兼容模式,在极速模式下是好的,现在我们来用代码实现网页自动调用国内...2016-09-20
  • .Net(c#)汉字和Unicode编码互相转换实例

    下面小编就为大家带来一篇.Net(c#)汉字和Unicode编码互相转换实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • PHP中对汉字进行unicode编码和解码的实现方法

    小编推荐的这篇文章介绍了PHP中对汉字进行unicode编码和解码的实现方法,非常实用,有兴趣的同学可以参考一下。 代码如下复制代码 //将内容进行UNICODE编码fu...2017-07-06
  • 微信扫码网站自动登录的实现方法

    微信扫码网站自动登录的原是还是比较简单的,只要各位知道相互的原理就可以实现了,下面我们来看两个例子,我相信各位看了这两个例子肯定知道怎么来做了。 magento 微...2016-11-25
  • php怎么运行c语言?php调用C代码的实现方法

    在php程序中有事会需要用到C代码,这篇文章着重介绍一下用C写php扩展的方法,而且不需要重新编译php。有需要的同学可以参考一下。 在php程序中需要用到C代码,应该是下...2017-07-06
  • php mysql_insert_id()返回数据库最新id实现方法

    php mysql_insert_id()返回数据库最新id实现方法 有需要同学可参考一下。 代码如下 复制代码 mysql_insert_id() mysql_insert_id() 函数...2016-11-25
  • php使用PDO事务配合表格读取大量数据插入操作实现方法

    本文介绍了php使用PDO事务配合表格读取大量数据插入操作实现方法,非常实用,有兴趣的同学快来看看吧。 在处理大量数据的时候,或者同时对几个表操作,而这几个表的操作...2017-07-06
  • C#实现Json转Unicode的方法

    这篇文章主要介绍了C#实现Json转Unicode的方法,可实现输入为带有json格式的文本,输出正常文本的功能,需要的朋友可以参考下...2020-06-25
  • PHP 正则匹配unicode 编码正则方法

    php教程 正则匹配unicode 编码正则方法,因为unicode编码的特殊性,所以一般的中文或英文正则是不能正确取到我们想要的内容的,下面来看一款专业的unicode正则表达式吧。...2016-11-25
  • 用PHP将Unicode 转化为UTF-8的实现方法

    小编推荐的这篇文章介绍了用PHP将Unicode 转化为UTF-8的实现方法,非常实用,有兴趣的同学快来看看吧。 代码如下复制代码 functionunescape($str) { $str= ra...2017-07-06
  • php模拟socket 多次发送数据的实现方法

    表四:Socket函数 函数名 描述 socket_accept() 接受一个Socket连接 socket_bind() 把socket绑定在一个IP地址和端口上 socket_clear_error() 清除socket...2016-11-25
  • php页面缓存实现方法总结

    在php页面缓存主要用到的是ob系列函数,如ob_start(),ob_end_flush(),ob_get_contents(),但是更高级的缓存是不使用这些函数的,本文章最后一个实现就有讲到,大家可参考一...2016-11-25
  • 异步JS框架的作用以及实现方法

    从异步JS的重要性开始说起,再引入异步js框架,一步步的深入了解异步JS。1.异步JS的重要性 随着Web平台地位的提升,霸占着浏览器的JavaScript语言也成为了世界上最流行的语言之一,甚至通过Node.js进入了服务器编程领域。Jav...2015-10-30
  • c++ base64编解码使用示例

    这篇文章主要介绍了c++的base64编解码使用示例,需要的朋友可以参考下...2020-04-25
  • PHP页面定时跳转实现方法

    php定时跳转我们需要利用header函数输入html或js代码来实现定时跳转了,下面我来介绍一个简单的例子 php代码 代码如下 复制代码 header("ref...2016-11-25