PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP高级编程 >> 高级应用 >> 

PHP序列化 serialize 格式详解

PHP序列化 serialize 格式详解

来源:互联网  作者:  发布时间:2010-01-26
1.前言 PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化

7.Unicode 字符串的序列化

好了,最后再谈谈 PHP 6 中关于 Unicode 字符串序列化的问题吧。

说实话,我不怎么喜欢把字符串搞成双字节 Unicode 这种编码的东西。JavaScript 中也是用这样的字符串,因此在处理字节流的东西时,反而非常的不方便。C# 虽然也是用这种方式来编码字符串,不过还好的是,它提供了全面的编码转换机制,而且提供这种字符串到字节流(实际上是到字节数组)的转换,所以处理起来还算是可以。但是对于不熟悉这个的人来说,转来转去就是个麻烦。

PHP 6 之前一直是按字节来编码字符串的,到了 PHP 6 突然冒出个 Unicode 编码的字符串来,虽然是可选的,但仍然让人觉得非常不舒服,如果配置不当,老的程序兼容性都成问题。

当然加了这个东西以后,许多老的与字符串有关的函数都进行了修改。序列化函数也不例外。因此,PHP 6 中增加了专门的 Unicode 字符串序列化标示 U。PHP 6 中对 Unicode 字符串的序列化格式如下:

 

U:<length>:"<unicode string>";

 

这里 <length> 是指原 Unicode String 的长度,而不是 <unicode string> 的长度,因为 <unicode string> 是经过编码以后的字节流了。

但是还有一点要注意,<length> 尽管是原 Unicode String 的长度,但是也不是只它的字节数,当然也不完全是指它的字符数,确切的说是之它的字符单位数。因为 Unicode String 中采用的是 UTF16 编码,这种编码方式使用 16 位来表示一个字符的,但是并不是所有的都是可以用 16 位表示的,因此有些字符需要两个 16 位来表示一个字符。因此,在 UTF16 编码中,16 位字符算作一个字符单位,一个实际的字符可能就是一个字符单位,也有可能由两个字符单位组成。因此, Unicode String 中字符数并不总是等于字符单位数,而这里的 <length> 指的就是字符单位数,而不是字符数。

那 <unicode string> 又是怎样被编码的呢?实际上,它的编码也很简单,对于编码小于 128 的字符(但不包括 \),按照单个字节写入,对于大于 128 的字符和 \ 字符,则转化为 16 进制编码的字符串,以 \ 作为开头,后面四个字节分别是这个字符单位的 16 进制编码,顺序按照由高位到低位排列,也就是第 16-13 位所对应的16进制数字字符(abcdef 这几个字母是小写)作为第一个字节,第 12-9 位作为第二个字节,第 8-5 位作为第三个字节,最后的第 4-1 位作为第四个字节。依次编码下来,得到的就是 <uncode string> 的内容了。

我认为对于其他语言来说,没有必要实现这种序列化方式,因为用这种方式序列化的内容,对于目前的主流 PHP 服务器来说都是不支持的,不过倒是可以实现它的反序列化,这样将来即使跟 PHP 6 进行数据交换,也可以互相读懂了。


延伸阅读:
实例详解PHP serialize与JSON解析

Tags: php   序列化   serialize   li   格式  
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号