PHP が中国語の文字列をインターセプトするときは、不完全なインターセプトや文字化けを避けるために、値が 128 以上であるかどうかに基づいてそれが 2 バイト文字であるかどうかを判断します。
しかし、中国語と英語が混在し、特殊な記号が含まれる状況に遭遇した場合、問題はそう簡単に解決できません。
以下は中国語の文字列傍受の問題を包括的に解決する機能です。必要な友達はそれを参照してください。
説明:
1. len パラメータは、形式を良くするために、中国語の文字に基づいています。
2. マジックパラメータが false に設定されている場合、中国語と英語が処理されます。
3. htmlspecialchars() でエンコードされた文字列に特に適しています (??)
例:
/**
@Intercept GB2312 エンコードに適した中国語文字列
@http://www.jbxue.com
*/
関数 FSubstr($title,$start,$len="",$magic=true)
{
$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--; $cnum);
if(strlen($title)
$ realnum = 0;
for($i=$start;$i
$cur = substr($title,$) i,1);
if($cur == "&")
{
if(substr($title,$i,4) == "<")
{
$cstep = 4; = 4;
$i += 3;
if($magic)
}
}
else if(substr($title,$i,4) ">")
{
$cstep = 4;
$i += 3;
if($magic)
}
else if(substr($title,$i,5) == "&")
$cstep = 5;
$i += 4; if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,6) == """)
{
$cstep = 6;
$length += 6;
$i += 5 ;
$realnum ++;
{
$alen ++;
}
else if(substr($title,$i,6) '")
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(preg_match("/& #(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]); += strlen($match[0]);
$i += strlen($match[0])-1;
if($magic)
$ctype; = 1;
}
}
}else{
if(ord($cur)>=128)
$cstep = 2;
$i += 1; +;
if($magic)
$blen ++;
}
}else{
$length +=1; $magic)
{
$alen++ ;
}
}
}
if($magic)
{
if(($blen*2+$alen) == ($len*2))
if( ($blen*2+$alen ) == ($len*2+1))
{
if($ctype == 1)
{
$length -= $cstep;
}else{
break; ;
}
}
}else {
if($realnum == $len)
}
unset($alen); $realnum);
unset($cstep);
}
;