錯誤示範
<?php
$str = "怎麼將新聞的很長的標題只顯示前面一些字";
$lenth = 19;
echo strlen($str) <= $lenth ? $str : substr($str,0,$lenth).chr(0)."....";
// chr(0) 僅阻斷單字節,UTF-8 中文 3 字節會被截斷產生亂碼
正確做法:mb_substr / mb_strimwidth
<?php
mb_internal_encoding('UTF-8');
$str = "怎麼將新聞的很長的標題只顯示前面一些字";
$len = 19;
// 方案一:mb_substr
echo mb_strlen($str) > $len ? mb_substr($str,0,$len).'...' : $str;
// 方案二:mb_strimwidth(自動補尾綴,寬度按字符寬度計算)
echo mb_strimwidth($str, 0, $len, '...', 'UTF-8');
手寫兼容函數(無 mbstring 環境)
<?php
function utf8_substr($str, $len) {
$r = '';
for ($i=0, $count=0; $i
現代最佳實踐
- 生產環境**強制開啟 mbstring 擴展**(PHP 內建)。
- 統一使用
mb_substr()、mb_strlen()、mb_strimwidth()。
- 框架層封裝
Str::limit($str, $len, '...')(Laravel)或 StringHelper::truncate()(Yii)。