2013-04-05 97 views

回答

19

strlen()沒有正確處理多字節字符,因爲它假設1個字符等於1個字節,這對於unicode來說簡直是無效的。這種行爲被記錄在這裏:http://php.net/strlen

的strlen()返回字節數的,而不是數字符串中的字符的。

解決方案是使用mb_strlen()函數代替(mb代表multi byte)(see mb_strlen() docs)。

EDIT

如果出於任何變化代碼的原因是不可能的/可行的,人們可能想要確保的字符串功能由多字節對應自動過載。這由PHP和documented here支持。

請注意,您可能還想編輯您的php.ini以確保mb_string按您的需要工作。可用的設置是documented here

+0

我想知道,分離unicode /非unicode函數的具體點是什麼?爲什麼不總是使用'(mb_)'函數? – 2014-12-25 09:06:41

+1

不久之後 - 這是因爲PHP設計(如語言)在很多地方都很糟糕,這也包括UTF8的支持。 PHP在內部不支持多字節編碼多年,這就是爲什麼創建多字節擴展的原因。你可以通過函數重載來自動使用'mb_' - >參見http://php.net/manual/en/mbstring.overload.php,但這取決於PHP配置,所以有時候直接使用'mb_ '如果你不能確保它會以其他方式使用。 – 2014-12-25 09:51:22

+0

感謝您的解釋,我的朋友,特別是指着'過載',完全錯過了..乾杯! – 2014-12-26 14:51:43

0

函數strlnen不計算字符數,而是計算字節數。對於多字節字符,它將返回更高的數字。
改爲使用mb_strlen()來計算字符的實際數量。

0

只是作爲附錄引用mb_strlen()其他答案:

如果php.in設置mbstring.func_overload有2位設置爲1,則strlen將計算基於默認字符集字符;否則會計算字符串中個字節的個數

相關問題