次のコードは、GB2312 エンコードに使用されます。PHP では、中国語の文字列をインターセプトするのが問題です。その解決策は、文字化けを避けるために、値が 128 以上であるかどうかに基づいてそれが 2 バイト文字であるかどうかを判断することです。ただし、中国語と英語の混合、特殊記号などの問題は常に存在します。参考のために、より包括的なものを書きます。
プログラムの説明:
1. len パラメータは、フォームをより美しくするために、中国語の文字に基づいています。
2. マジックパラメータが false に設定されている場合、中国語と英語は同等に扱われ、絶対文字数が取得されます。
3. htmlspecialchars() でエンコードされた文字列に特に適しています
4. GB2312 のエンティティ文字モード (𖰰)
プログラム コードを正しく処理できます。
function FSubstr($title,$start,$len="",$magic=true)
{
/**
* スマートピッグを搭載
*メールアドレス:[email protected]
*/
$長さ = 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)
;
$blen = 0;
$realnum = 0;
for($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cstep = 0;
$cur = substr($title,$i,1);
if($cur == "&")
{
if(substr($title,$i,4) == "<")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum++;
if($マジック)
{
$アレン++;
}
}
else if(substr($title,$i,4) == ">")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum++;
if($マジック)
{
$アレン++;
}
}
else if(substr($title,$i,5) == "&")
{
$cstep = 5;
$length += 5;
$i += 4;
$realnum++;
if($マジック)
{
$アレン++;
}
}
else if(substr($title,$i,6) == """)
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum++;
if($マジック)
{
$アレン++;
}
}
else if(substr($title,$i,6) == "'")
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum++;
if($マジック)
{
$アレン++;
}
}
else if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum++;
if($マジック)
{
$ブレン++;
$ctype = 1;
}
}
}それ以外{
if(ord($cur)>=128)
{
$cstep = 2;
$length += 2;
$i += 1;
$realnum++;
if($マジック)
{
$ブレン++;
$ctype = 1;
}
}それ以外{
$cstep = 1;
$length +=1;
$realnum++;
if($マジック)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$ブレン++;
}それ以外{
$アレン++;
}
}
}
}
if($マジック)
{
if(($blen*2+$alen) == ($len*2)) ブレーク;
if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$length -= $cstep;
壊す;
}それ以外{
壊す;
}
}
}それ以外{
if($realnum == $len) ブレーク;
}
unset($cur)
;
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);
return substr($title,$start,$length);
笑
、後で UTF-8 エンコード コードも投稿します。