次のコードは GB2312 エンコードに使用されます。PHP では中国語の文字列をインターセプトするのが問題です。その解決策は、文字化けを避けるために、値が 128 以上であるかどうかに基づいてそれが 2 バイト文字であるかどうかを判断することです。ただし、中国語と英語の混合、特殊記号などの問題は常にあります。ここで、参考のために、より包括的なものを書きます。
プログラムの説明:
1。
2 の形式で見栄えを良くするために、中国語の文字に基づいており、1len は英語の 2 文字に相当します。マジック パラメータが false に設定されている場合、中国語と英語は同等に扱われ、その絶対数は文字は取得されます
3. htmlspecialchars() でエンコードされた文字列に特に適しています
4. GB2312 () のエンティティ文字モードを正しく処理できます
プログラムコード:
function FSubstr($title, $start,$len="",$magic=true)
{
/**
* powered by Smartpig
* mailto:d.einstein@263.net
*/
$length = 0;
if($len == " ") $len = strlen($title);
//開始位置が間違っていると判断
if($start > 0)
{
$cnum = 0;
for($i=0;$i<$start;$i )
{
if(ord(substr($title,$i,1) )) >= 128) $cnum ;
}
if($cnum%2 != 0) $start--;
unset($cnum); >
if(strlen($title)< ;=$len) return substr($title,$start,$len);
$alen = 0; 🎜>
$realnum = 0;
for($i=$start;$i
$ctype = 0; > $cstep = 0;
$cur = substr($title,$i,1);
if($cur == "&")
{
if(substr($title, $i,4) == "<")
{
$cstep = 4;
$i = 3;
($magic)
{
$ alen ;
}
}
else if(substr($title,$i,4) == ">")
{
$cstep = 4;
$i = 3;
if($magic)
{
$alen ; }
}
else if(substr ($title,$i,5) == "&")
{
$cstep = 5;
$i = 4;
$realnum ;
if($magic)
{
$alen ;
}
else if(substr($title,$i) ,6) == """)
{
$cstep = 6;
$length = 6;
$i = 5;
$realnum ;
if($magic )
{
$alen ;
}
}
else if(substr($title,$i,6) == "'")
{
$cstep = 6;
$i = 5;
if($magic)
{
$alen ; }
else if(preg_match("/& #(d );/i",substr($title,$i,8),$match))
{
$cstep = strlen($match [0]);
$length = strlen($match[0])-1;
$realnum ; )
{
$blen
$ctype = 1;
}
}else{
if(ord($cur)>>=128)
{
$cstep = 2;
$length = 2;
$i = 1;
$realnum ;
if($magic)
{
$blen ;
$ctype = 1;
}
}else{
$cstep = 1;
$length =1;
$realnum ;
if($magic)
{
$alen ;
}
}
}
if($magic)
{
if(($blen*2 $alen) == ($len*2)) break ;
if(($blen*2 $alen) == ($len*2 1))
{
if($ctype == 1)
{
$length -= $ cステップ;
休憩;
}else{
休憩;
}
}
}else{
if($realnum == $len) break;
}
}
unset($cur);
設定を解除($alen);
設定を解除($blen);
unset($realnum);
unset($ctype);
設定解除($cstep);
return substr($title,$start,$length);
}