2013-03-24 71 views
0

因此,我發佈了幾個問題,涉及使用PHP編寫的現有軟件更新以支持unicode/utf8。其中一個解決方案是用PHP的mb_string函數覆蓋PHP的默認字符串函數。但是,我看到很多人在談論消極後果,但沒有人真正闡述它們。有人能解釋這些消極後果嗎?使用mb_string函數覆蓋PHP的默認字符串函數

爲什麼用它的mb_string函數重寫PHP的默認字符串函數是「壞」?畢竟這比用手動替換所有那些具有相應mb_函數的函數簡單得多。那麼我錯過了什麼?這些消極後果是什麼?

+0

Duplicate http://stackoverflow.com/questions/12045940/php-string-functions-vs-mbstring-functions但其他人不是特別好的答案。 – Danack 2013-03-24 11:09:17

回答

0

重寫它們是不好的,因爲如果其他開發者來了並且在這個代碼上工作,那麼它可能會做一些他並不期望的事情。按照預期使用默認功能總是很好的。

0

我認爲mb_ *家庭功能更重,因爲他們也執行unicode測試以及簡單的ascii字符串。所以大規模他們會減慢你的應用程序的速度。 (可能沒有多大意義,但肯定不知道。)

0

我會盡力詳細說明。

使用mb_*重載標準字符串函數將會對任何讀取和處理二進制文件或一般二進制數據產生嚴重後果。如果你超載了標準函數,那麼突然strlen($binData)必然會在某個點返回錯誤的長度。

爲什麼?

想象二進制數據包含在所述範圍0xC0的值的字節 - 0xDF0xE0 - 0xEF0xF0 - 0xF7。這些是Unicode起始字節,現在重載的strlen會將以下字符計爲1個字節,而不是它們應該分別存在的2,3和4個字節。

而主要問題是mbstring.func_overload是全球性的。它不僅會影響您自己的腳本,還會影響所有腳本以及它們可能使用的任何框架或庫。

當問及時,我應該啓用mbstring.func_overload。答案總是,而且應該始終是一個響亮的NO。

如果你使用它,你就會被皇家使用,並且你會花費無數個小時來狩獵bug。錯誤很可能是不可修復的。

那麼,你可以打電話mb_strlen($string, 'latin1')讓它表現,但它仍然包含開銷。 strlen使用的事實,PHP字符串就像Java字符串;他們知道自己的長度。 mb_strlen分析字符串以計算字節數。