推薦使用暴力版的, 安全可靠; 溫柔版的從程序編寫的角度看比較高效. 呵呵
基本原理是修正 off, len 可能的錯位, 溫柔版是從 off 往前倒尋, 尋到第一個 <0xa0 的字符認為是普通字符, 搜尋結束, 根據次數判定是否有錯位...
/**
* @brief 簡潔高效的字符串截取函數 (支持 CJK字符)
*
* 只是簡單判定了高位部分的ASCII值, 能應付絕大多數正規的中英文混合字符串
* 不支持 4字節或3字節的 utf 編碼
*
* 要點: 修正雙字節中錯位的 off 值 / len 值 (注重參數 $len 缺省值為 -1的用意)
* 用法和 substr() 一樣, 針對 GBK 碼的低位(0x40開始)可能有問題
*/
function my_substr($str, $off, $len = -1)
{
$mlen = strlen($str);
/* 第0步: 參數安全檢查與修正 */
if ($off < 0)
$off = $mlen;
if ($off > $mlen)
$off = 0;
/* 第1步: $off 修正, 倒尋 */
if ($off > 0)
{
$fix = $off;
$mb = false;
do
{
$ch = ord($str{$fix--});
if ($ch < 0x80)
break;
$mb = true;
}
while ($fix);
if ($mb)
{
$fix = ($off - $fix);
if ($fix & 1)
{
$off--;
$len ;
}
}
}
/* 第2步: $len 修正, 同上 */
if ($len <= 0 || ($len $off) >= $mlen)
{
$len = $mlen - $off;
}
else
{