我們都知道在程序中如果要截取字符串,是英文我們可以直接用substr就行了,是不會出現亂碼的,如果是中文就很不好解決了。
下面給出兩種解決辦法:
(一)直接使用Multi-Byte函數庫的mb_substr();函數就行了,實例代碼如下
<?PHP
echo mb_substr($str, $start, $length, $encoding);
echo "<br />";
?>
這種方法比較簡單,但是有的服務器不支持,所以我們再介紹另一種方法
(二)自定義截取中文字符串函數,基本上就是仿照mb_substr寫個函數,直接調用罷了,以下為我找到的代碼,其實很簡單
<?PHP
function substr_cn($string_input,$start,$length)
{
/* 功能:
* 此算法用於截取中文字符串
* 函數以單個完整字符為單位進行截取,即一個英文字符和一個中文字符均表示一個單位長度
* 參數:
* 參數$string為要截取的字符串,
* 參數$start為欲截取的起始位置,
* 參數$length為要截取的字符個數(一個漢字或英文字符都算一個)
* 返回值:
* 返回截取結果字符串
* */
$str_input=$string_input;
$len=$length;
$return_str="";
//定義空字符串
for ($i=0;$i<2*$len+2;$i++)
$return_str=$return_str." ";
$start_index=0;
//計算起始字節偏移量
for ($i=0;$i<$start;$i++)
{
if (ord($str_input{$start_index}>=161)) //是漢語
{
$start_index+=2;
}
else //是英文
{
$start_index+=1;
}
}
$chr_index=$start_index;
//截取
for ($i=0;$i<$len;$i++)
{
$asc=ord($str_input{$chr_index});
if ($asc>=161)
{
$return_str{$i}=chr($asc);
$return_str{$i+1}=chr(ord($str_input{$chr_index+1}));
$len+=1; //結束條件加1
$i++; //位置偏移量加1
$chr_index+=2;
continue;
}
else
{
$return_str{$i}=chr($asc);
$chr_index+=1;
}
}
return trim($return_str);
}//end of substr_cn
?>