php序列化與反序列化時字符集不一致問題的解決辦法

2022-06-07 19:57:11 字數 1169 閱讀 6052

今天的用php的時候無意的出現了用unserialize()函式轉換老是返回false,我確認我的字串是沒錯的,測試了很多次還是一樣,沒辦法,啟用了error_reporting(e_all)啟用錯誤資訊,

沒想到發現了notice: unserialize() [function.unserialize]: error at offset的資訊, 因為我字元我是從陣列轉換過來的,所以應該是沒有錯的, google了一下,原來是編碼問題,

原來我的字串是從資料庫裡取出來的,而原來插入資料庫時我的php用的是anscii編輯,而我複製出來後用unserialize()的php檔案是utf-8編碼,編碼不同,所以就出現錯誤了.

例子:首頁以anscii方式操作

<?php

$arr = array('en' => 'hello', 'cn' => '您好');

$str = serialize($arr

);echo

$str

;?>

輸出結果: a:2:

然後以utf-8的編碼方式來測試

則以上**的輸出結果為: a:2:

看到有什麼不同了吧,在出現中文字元時字元長度就不一樣了,也就是strlen('您好')在第一種編碼中是4,而在第二種編碼中是6,其中原因可以檢視相關手冊. 

而unsrialize()要根據類似 s:6:"您好" 中的6來判斷字元長度並進行反序列,但原來的是4,字元長度不符,也就是出現了offset錯誤

解決辦法:

將要反序列的字串進行一次轉換,**

$str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $str );

或者用自己自定的函式來代替unserialize

function mb_unserialize($serial_str

)

測試過該方法 確實挺管用

php比較麻煩的非屬編碼問題不可了,我們在處理字元問題的時候,很多函式都要我們自己進行自定義重寫,所以不是統一編碼的好一點.

**作者遇到的問題是:ecshop 一直迴圈登入,$_session 儲存不上(具體應該是存到資料庫的session表了,但是反序列化的時候false,所以表現為,session沒存上或丟失了)

php序列化與反序列化

php的序列化 反序列化對與一些大檔案的壓縮操作,讀寫操作十分有用。乙個簡單的序列化案例 同時用到了序列化與反序列化函式,二者在被呼叫時會分別自己呼叫對應的函式,sleep 以及 wakeup.sleep和 wakeup練習題 故事 乙個果農生產了很多水果種類,於是需要把乙個買家指定的種類寄給他,生...

php 序列化與反序列化

序列化 反序列化序列化 例一class user number 66 str jerry bool true null null arr array a 1,b 2 user new user tom true var dump serialize number var dump serialize...

php序列化與反序列化

jarvisoj上的一道題 是關於php序列化以及反序列化引起的問題,我看 wp大神的wp 題目給直接給出了源 這句話是關鍵,漏洞產生在php serialize和php解析方式上。如果我們通過php serialize的方式構造序列化語句,然後通過php的方式解析序列化語句,就會出現問題。原因是在...