繁体   English   中英

PHP:序列化数组保存在(由人类)不可读的 UTF-16LE 编码.txt 文件中 - 错误或预期行为?

[英]PHP: Serialized array is saved in (by humans) unreadable UTF-16LE encoded .txt file — bug or intended behaviour?

I am teaching myself programming websites with OOP in PHP (using XAMPP Version 7.3.14 for Windows), and recently I learned how to save serialized arrays containing objects ( file_put_contents('path/filename.txt', serialize($array)); )。 我已经用普通的 arrays 做到了这一点。 为了练习一下,我写了一个小网站,其中包含一个用于添加新记录的表单模板和一个用于在屏幕上打印带有指向单个记录的链接的列表的显示模板,因为我遇到了以下现象:

在对象的 class 定义中(实例化为一维数字数组的元素),我正在使用的所有属性都初始化为protected ,并且在 class 定义之外的实际程序代码中使用 getter 和 setter 方法获取和设置它们的值. 当我向数组添加一条新记录(此时仍从 PHP 代码中读取)并第一次保存数组时,结果.txt 文件以 UTF-8 编码,序列化字符串显示拉丁文的“正常”语法字母,例如:

a:4:{i:0;O:8:"stdClass":6:{s:13:" * property_1"; s:7:"value_1"; ...

但是,在我修改了程序代码后,现在从very.txt文件( unserialize(file_get_contents('path/filename.txt', $array));中读取数据并再次保存它,生成的文件以 UTF-16LE 编码并包含中文字符,因此我无法阅读。 尽管如此,PHP 解释器显然仍然可以读取该文件。 进一步的测试表明,这种行为似乎与属性的保护状态有关。 将属性的初始化模式更改为public后,将读取 UTF-16LE 编码文件,但再次保存时,它会变回“正常” UTF-8 编码文件。

最后我的问题是:这是已知行为还是我的 PHP 解释器的错误? 当我搜索互联网时,我没有找到任何适合我观察的东西。

PHP 序列化不是人类可读的格式。 您还可以在手册中看到:

Note that this is a binary string which may include null bytes

https://www.php.net/manual/en/function.serialize.php

私有和受保护的属性带来 null 字节。 例如

class A{
    private $b='0';
}

echo bin2hex(serialize(new A())), PHP_EOL;
echo serialize(new A());

Output

4f3a313a2241223a313a7b733a343a2200410062223b733a313a2230223b7d
 O : 1 : " A " : 1 : { s : 4 : "   A   b " ; s : 1 : " 0 " ; }
                                 ^   ^
                                 |   | null bytes
                                   ^
                                   |  class name for private or * for protected

Null 字节字符串不可打印,因此,您的文本编辑器“决定”您需要其他编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM