2008-10-21 65 views
5

我正在使我的PHP網站能夠識別Unicode。我想知道是否有人有mbstring.func_overload設置的經驗,它用多字節當量(mb_strlen)代替正常字符串函數(例如strlen)。 PHP手冊頁上沒有任何評論。我應該使用多字節重載(mbstring.func_overload)嗎?

是否有任何潛在的問題我應該知道?任何調用多字節版本的情況都是一個壞主意?

我想一個例子是加密處理功能,因爲它們可能希望處理的字節串,而不是字符的字符串。

此外,手冊頁面還包含一個註釋:「不建議在每個目錄上下文中使用函數重載選項,因爲尚未確認在生產環境中足夠穩定,並可能導致未定義的行爲「。

這是否意味着它在每個目錄上下文中不穩定,或者它通常不穩定?措辭不清楚。

回答

4

一個問題,你一定要留意是第三方腳本(可能是庫或梨擴展),其使用功能的非MB感知版本。例如,使用strlen()的庫可能會導致問題,如果您超載它。

以及此bug report顯示在5.2/5.3 CVS版本中已更正了mb_overloaded函數的虛擬主機泄漏。該錯誤特定於每個目錄的配置。

5

我的回答是:絕對不是

問題是,沒有簡單的方法來重置str *函數,一旦它們超載。

有一段時間,可以與你的項目很好地工作,但幾乎可以肯定,你會遇到使用字符串函數,例如,實現一個二進制協議的外部庫,他們會失敗。他們會失敗,你會花幾個小時試圖找出他們失敗的原因。

後你發現它的mbstring.func_overload,你沒有太多的選擇。每次調用外部庫並將其設置回來時,您都可以將mbstring.internal_encoding設置爲每字符一個字節的編碼,但如果您的庫對應用程序進行回調,則會導致錯誤。

另一種選擇是手動調整的庫,改變所有STR *函數到其mb_string配對並通過單字節每炭作爲編碼的參數。但是,這也不是一個好主意,因爲你失去了輕鬆更新外部的能力,並且也可能導致一些性能問題。

所以,再次,不要使用func_overload。如果您使用多字節字符串,請使用適當的mb_函數。

+0

mbstring.func_overload只是一個壞的方式,我不知道有多少我目前尚未解決的問題,我收到的是由於這一點。我寫了一個類來生成ePub文件,以及一個處理Zip文件的伴隨類。 Zip函數中的構建沒有用處有一些原因。我花了整整一個週末來看,直到報告bug的人提到他們已經設置他們的服務器來使用utf-8。我甚至不知道mbstring.func_overload存在,現在我遇到了麻煩,因爲設置mbstring使用ascii也是不可能的,因爲我*還*使用帶有mb_函數的UTF-8。 – 2014-06-16 11:27:54