XOOPS_ROOT_PATH.'/include/functions.php'裡有
function xoops_substr
此函式實際上使用位在
XOOPS_ROOT_PATH.'/class/xoopslocal.php'
的public static function substr
public static function substr($str, $start, $length, $trimmarker='...')
{
if (!XOOPS_USE_MULTIBYTES) {
return (strlen($str) - $start <= $length) ? substr($str, $start, $length) : substr($str, $start, $length - strlen($trimmarker)) . $trimmarker;
}
if (function_exists('mb_internal_encoding') && @mb_internal_encoding(_CHARSET)) {
$str2 = mb_strcut($str, $start, $length - strlen($trimmarker));
return $str2 . (mb_strlen($str) != mb_strlen($str2) ? $trimmarker : '');
}
return $str;
}
這邊筆者用幾個範例來測試這兩段if輸出的差異
使用相同的中英文字串
$str="How are you? I\’m fine, thank you.";
$str="聽說要用字元數量判斷文章字數耶。";
【測試:if(!XOOPS_USE_MULTIBYTES)】
return (strlen($str) - $start <= $length) ? substr($str, $start, $length) : substr($str, $start, $length - strlen($trimmarker)) . $trimmarker;
設定$start=0, $length=7, $trimmarker='...'。
strlen($trimmarker) = 3
(英文字串)
$str="How are you? I\’m fine, thank you.";
strlen($str) = 36
輸出結果:How ...
(中文字串)
$str="聽說要用字元數量判斷文章字數耶。";
strlen($str) = 48
輸出結果:聽�...
【測試:if (function_exists('mb_internal_encoding') && @mb_internal_encoding(_CHARSET)) 】
$str2 = mb_strcut($str, $start, $length - strlen($trimmarker));
return $str2 . (mb_strlen($str) != mb_strlen($str2) ? $trimmarker : '');
同樣設定$start=0, $length=7, $trimmarker='...'
此段程式碼使用mb_strlen、mb_strcut
strlen($trimmarker) = 3
(英文字串)
$str="How are you? I\’m fine, thank you.";
$str2 = How
mb_strlen($str) =34
mb_strlen($str2) = 4
輸出結果:How ...
(中文字串)
$str="聽說要用字元數量判斷文章字數耶。";
$str2=聽
mb_strlen($str) =16
mb_strlen($str2) = 1
輸出結果:聽...
====================================
結論:
中文要使用第二段程式碼才能正常輸出
若要正常輸出中文
在XOOPS_ROOT_PATH.'/language/'內要記得將此常數定義為1
(預設:/language/english/global.php)
// change 0 to 1 if this language is a multi-bytes language
define('XOOPS_USE_MULTIBYTES', '0');