簡體   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