以下程式碼試用於GB2312編碼,截取中文字串是PHP中一個頭痛的問題,解決方法是根據值是否大於等於128來判斷是否是雙字節字符,以避免出現亂碼的情況。但中英文混合、特殊符號等問題總是存在,現在寫一個比較全面的,僅供參考:
程序說明:
1. len 參數以中文字符為標準,1len等於2個英文字符,為了形式上好看些
2. 如果將magic參數設為false,則中文和英文同等看待,取絕對的字符數
3. 特別適用於用htmlspecialchars()進行過編碼的字串
4. 能正確處理GB2312中實體字元模式()
程式碼:
function FSubstr($title, $start,$len="",$magic=true)
{
/**
* 由 Smartpig 提供支援
* mailto:d.einstein@263.net
*/
$length = 0;
if($len == " ") $len = strlen($title);
//判斷起始為不正確位置
if($start > 0)
{
$cnum = 0)
{
$cnum = 0;
for($i=0;$i {
if(ord(substr($title,$i,1)) >= 128) $cnum ;
;
if($cnum%2 != 0) $start--;
unset($cnum);
}
if(strlen($title)
$alen = 0;
$blen = 0;
$blen = 0;
$realnum = 0; >for($i=$start;$i
$ctype = 0;
$cstep = 0;
title,$i,1);
if($cur == "&")
{
if(substr($title,$i,4) == "{
$cstep = 4;
$length = 4;
$i = 3)
{
$alen ;
}
}
else if(substr($title,$i,4) == ">")
;
$i = 3;
$realnum ;
if($magic)
else if(substr($title,$ i,5) == "&")
{
$cstep = 5;
$ c 🎜> if($ magic)
{
$alen ;
}
}
$ cstep = 6;
$length = 6;
$i = 5;
$alen ;
}
}
else if(substr($title,$i,6) == "'")
{
$i = 5;
$realnum ;
if($magic)
{
if(preg_match("/(d ); /i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
]);
$i = strlen($match[0])-1;
$realnum ;
if($ $ctype = 1;
}
}
}else{
if(ord($cur)>=128)
{
$cstep = 2; if($magic)
{
$blen ;
$cstep = 1;
$length = 1;
$realnum ;
if($magic)
{
if($magic)
{
if(($blen*2 $alen) == ($len*2)) break ;
if(($blen*2 $alen) == ($len*2 1)
{
if($ctype == 1)
{
🎜> 休息;
}
}
}else{
if($realnum == $len) break;
}
}
($alen);
未設定($blen);
未設定($realnum);
未設定($ctype);
取消設定($cstep);
return substr($title,$start,$length);
}
http://www.bkjia.com/PHPjc/313733.html
www.bkjia.com
true
http: //www.bkjia.com/PHPjc/313733.html
TechArticle