对于不同编码的中文,系统自带的函数定义是不一样的,怎么解决这问题呢?请看下文
utf-8中文字符占三个字节,GB18030兼容GBK兼容GB2312中文字符占两个字节,ISO8859-1是拉丁字符(ASCII字符)占一个字节
对于文件编码是UTF-8
header(
'Content-type:text/html;charset=utf-8'
);
/**
* 可以统计中文字符串长度的函数
* @param $str 要计算长度的字符串
* @param $type 计算长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符
*
*/
function
abslength(
$str
)
{
if
(
empty
(
$str
)){
return
0;
}
if
(function_exists(
'mb_strlen'
)){
return
mb_strlen(
$str
,
'utf-8'
);
}
else
{
preg_match_all(
"/./u"
,
$str
,
$ar
);
return
count
(
$ar
[0]);
}
}
$str
=
'我们都是中国人啊,ye!'
;
$len
= abslength(
$str
);
var_dump(
$len
);
//return 12
$len
= abslength(
$str
,
'1'
);
echo
'<br />'
.
$len
;
//return 22
/*
utf-8编码下截取中文字符串,参数可以参照substr函数
@param $str 要进行截取的字符串
@param $start 要进行截取的开始位置,负数为反向截取
@param $end 要进行截取的长度
*/
function
utf8_substr(
$str
,
$start
=0) {
if
(
empty
(
$str
)){
return
false;
}
if
(function_exists(
'mb_substr'
)){
if
(func_num_args() >= 3) {
$end
= func_get_arg(2);
return
mb_substr(
$str
,
$start
,
$end
,
'utf-8'
);
}
else
{
mb_internal_encoding(
"UTF-8"
);
return
mb_substr(
$str
,
$start
);
}
}
else
{
$null
=
""
;
preg_match_all(
"/./u"
,
$str
,
$ar
);
if
(func_num_args() >= 3) {
$end
= func_get_arg(2);
return
join(
$null
,
array_slice
(
$ar
[0],
$start
,
$end
));
}
else
{
return
join(
$null
,
array_slice
(
$ar
[0],
$start
));
}
}
}
$str2
=
'wo要截取zhongwen'
;
echo
'<br />'
;
echo
utf8_substr(
$str2
,0,-4);
//return wo要截取zhon
上篇:php获取客户端IP地址
本文地址:https://www.freemoban.com/php/2015/0215/572.html