function substr_cn($str, $len, $start = 0)
{
$strlen = strlen($str);
for($i = 0; $i < $strlen; $i++)
{
if($i >= $start && $i < ($start + $len))
{
if(ord(substr($str, $i,1)) > 0xa1)
{
$tmpstr .= substr($str, $i, 2);
$i++;
}else
$tmpstr .= substr($str, $i, 1);
} }
if(strlen($tmpstr) > $len)
{
$len--;
return substr_cn($str, $len, $start);
}
return $tmpstr;
}
{
$strlen = strlen($str);
for($i = 0; $i < $strlen; $i++)
{
if($i >= $start && $i < ($start + $len))
{
if(ord(substr($str, $i,1)) > 0xa1)
{
$tmpstr .= substr($str, $i, 2);
$i++;
}else
$tmpstr .= substr($str, $i, 1);
} }
if(strlen($tmpstr) > $len)
{
$len--;
return substr_cn($str, $len, $start);
}
return $tmpstr;
}
这个函数我知道你的用意啊,就是用于截取中文字符串而使不会截断最后一个中文字而来的。
但我的意思是假设我已有一个字符串,可能最后一个字已被截断或未截断,我想把如果截断了的就放弃最后一个字的方法。
function substr_cn($str, $len, $start = 0)
{
$strlen = strlen($str);
for($i = 0; $i < $strlen; $i++)
{
if($i >= $start && $i < ($start + $len))
{
if(ord(substr($str, $i,1)) > 0xa1)
{
$tmpstr .= substr($str, $i, 2);
$i++;
}else
$tmpstr .= substr($str, $i, 1);
} }
if(strlen($tmpstr) > $len)
{
$len--;
return substr_cn($str, $len, $start);
}
return $tmpstr;
}
$ch = chr(127);
$p = array("/[\x81-\xfe]([\x81-\xfe]|[\x40-\xfe])/","/[\x01-\x77]/");
$r = array("","");
//func_num_args,func_num_args 可变参数函数列表
if(func_num_args() > 2)
$end = func_get_arg(2);
else
$end = strlen($str);
if($start < 0)
$start += $end; if($start > 0) {
$s = substr($str,0,$start);
if($s[strlen($s)-1] > $ch) {
$s = preg_replace($p,$r,$s);
$start += strlen($s);
}
}
$s = substr($str,$start,$end);
$end = strlen($s);
if($s[$end-1] > $ch) {
$s = preg_replace($p,$r,$s);
$end += strlen($s);
}
return substr($str,$start,$end);
}
字段的编码设为gbk后,sql语句里使用substr,left等都能自动处理中文。
比如left( x , 5 ) 是取左边5个字符(包括中文和英文,绝对不会产生半个汉字)
所以一般,截取汉字的时候,都是第一个字符开始判断的,要是能判断是不是前一位还是后一位,截取汉字的效率,会大幅度提高