**需要擷取等寬新聞標題,對於gb編碼的擷取函式網上很多,沒找到有適合utf-8編碼的。 考慮到utf-8是1-4位元組變長編碼,雖然中文都是3位元組,為了以後方便決定自己寫個。
擷取的變數是寬度width而不是長度length。不同中英文(包括數字)字型搭會有不同顯示效果,在不同顯示器上相同字型也可能會有不同效果。 需要根據實際修改 x3變數的值,x3越大則3位元組編碼(如中文)字元就取得越少。 全中文與全英文/數字擷取顯示寬度差異最大,且擷取寬度值越大越明顯。 中英文混排情況時差異較小。
/*** 擷取utf8編碼字串從首位元組開始指定寬度(非長度), 適用於字串長度有限的如新聞標題的等寬度擷取
* 中英文混排情況較理想. 全中文與全英文擷取後對比顯示寬度差異最大,且擷取寬度遠大越明顯.
* @param string $str utf-8 encoding
* @param int[option] $width 擷取寬度
* @param string[option] $end 被擷取後追加的尾字元
* @param float[option] $x3
* 3位元組(中文)字元相當於希臘字母寬度的係數coefficient(小數)
* 中文通常固定用宋體,根據ascii字元字型寬度設定,不同瀏覽器可能會有不同顯示效果
** @return string
* @author waiting
* */function u8_title_substr($str, $width = 0, $end = '...', $x3 = 0)
$arr = str_split($str);
$len = count($arr);
$w = 0;
$width *= 10;
// 不同位元組編碼字元寬度係數
$x1 = 11; // ascii
$x2 = 16;
$x3 = $x3===0 ? ( $cfg['cf3'] > 0 ? $cfg['cf3']*10 : $x3 = 21 ) : $x3*10;
$x4 = $x3;
// for ($i = 0; $i < $len; $i++)
$c = ord($arr[$i]);
if ($c <= 127)
elseif ($c >= 192 && $c <= 223)
elseif ($c >= 224 && $c <= 239)
elseif ($c >= 240 && $c <= 247)
}return implode('', array_slice($arr, 0, $i) ). $e;
}
中英文本串擷取
substringlength 每行限制文字數量 預設是20個字元 按照英文本元長度來計算,乙個中文字元相當於兩個英文本元 replacecharacter 超出字元代替樣式 預設是 擷取字元 string substring string strinput return resultstr rep...
PHP擷取中英文本串
php擷取gb2312中文字串 php擷取gb2312中文字串 param str 被擷取的字串 param start 起始長度 param len 擷取長度 param suffix 字尾字串 function gbk str str,start,len,suffix i else return...
PHP擷取中英文本串長度
我們經常會遇到需要擷取字串 含中文漢字 長度的情況,比如標題顯示不能超過多少字元,超出的長度用 表示,以下函式可以滿足你的需求。utf 8 gb2312都支援的漢字擷取函式 cut str 字串,擷取長度,開始長度,編碼 編碼預設為 utf 8 開始長度預設為 0 function cutstr s...