我試圖讓這個Unicode字符字符串的長度的strlen()PHP函數給出的Unicode字符長度錯誤
$text = 'نام سلطان م';
$length = strlen($text);
echo $length;
輸出
20
它是如何決定的Unicode字符長度串?
我試圖讓這個Unicode字符字符串的長度的strlen()PHP函數給出的Unicode字符長度錯誤
$text = 'نام سلطان م';
$length = strlen($text);
echo $length;
輸出
20
它是如何決定的Unicode字符長度串?
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。
您正在尋找mb_strlen
。
函數strlnen
不計算字符數,而是計算字節數。對於多字節字符,它將返回更高的數字。
改爲使用mb_strlen()
來計算字符的實際數量。
只是作爲附錄引用mb_strlen()
其他答案:
如果php.in
設置mbstring.func_overload
有2位設置爲1,則strlen
將計算基於默認字符集字符;否則會計算字符串中個字節的個數
我想知道,分離unicode /非unicode函數的具體點是什麼?爲什麼不總是使用'(mb_)'函數? – 2014-12-25 09:06:41
不久之後 - 這是因爲PHP設計(如語言)在很多地方都很糟糕,這也包括UTF8的支持。 PHP在內部不支持多字節編碼多年,這就是爲什麼創建多字節擴展的原因。你可以通過函數重載來自動使用'mb_' - >參見http://php.net/manual/en/mbstring.overload.php,但這取決於PHP配置,所以有時候直接使用'mb_ '如果你不能確保它會以其他方式使用。 – 2014-12-25 09:51:22
感謝您的解釋,我的朋友,特別是指着'過載',完全錯過了..乾杯! – 2014-12-26 14:51:43