最近,在公司负责第三方短信运营商对接开发时,遇到了转码和序列化的问题,再请教了大神之后才终于解决了,下边重点回顾下PHP中的各种序列化和编码的功能和应用场景。
功能:便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。
场景:此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。
编码原理:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
注1:这个不仅仅用于页面传递url参数部分,在交换数据时也可以采用此种编码,只要双方协商好就行了。
注2:此编码在将空格编码为加号(+)。
注3:超全局变量 $_GET 和 $_REQUEST 已经被解码了。对 $_GET 或 $_REQUEST 里的元素使用 urldecode() 将会导致不可预计和危险的结果。
功能和场景和urlencode和urldecode类似,区别在于处理+的问题上。
rawurlencode将空格编码为%20;
rawurldecode() 不会把加号('+')解码为空格。
注:支持直接中文操作。
功能:序列化与反序列化,igbinary 來解決這個問題,而且速度比 serailizer 和 json 快很多。
场景:对象序列化,支持中文直接操作。
注:使用此函数必须安装igbinary扩展,速度方面igbinary > json >serailizer。
功能:生成 URL-encode 之后的请求字符串;生成url的组成部分。
主:支持直接中文操作,会自动进行url-encode。
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data) . "\n";
echo http_build_query($data, '', '&');
/*结果
foo=bar&baz=boom&cow=milk&php=hypertext+processor
foo=bar&baz=boom&cow=milk&php=hypertext+processor
*/
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url));
//结果
array(8) {
["scheme"]=>
string(4) "http"
["host"]=>
string(8) "hostname"
["port"]=>
int(9090)
["user"]=>
string(8) "username"
["pass"]=>
string(8) "password"
["path"]=>
string(5) "/path"
["query"]=>
string(9) "arg=value"
["fragment"]=>
string(6) "anchor"
}
?>
功能:采用MIME base64对data进行编码和解码。
场景:对订单号进行加密,因为是可逆的。
功能:产生一个可存储的值的表示,支持直接中文操作。
场景:对象的传输必须系列化二进制才行,必须用到此函数。
注1:unserialize若被解序列化的变量是一个对象,在成功地重新构造对象之后,PHP 会自动地试图去调用 __wakeup() 成员函数(如果存在的话)。
注2:当序列化对象时,PHP 将试图在序列动作之前调用该对象的成员函数 __sleep()。
功能:对变量进行 JSON 编码(所有字符串数据的编码必须是 UTF-8);
对 JSON 格式的字符串进行解码(这个函数仅能处理 UTF-8 编码的数据);
场景:数据传输时需要序列化和反序列化,尤其是在跨语言操作时,json是一种标准。