*我们在处理中文数据时,经常要处理一些情况,下面就是针对这些情况,我做的一些函数,已经用在了实践中*#判断某个位置是中文字符的左还是右半部分,或不是中文#返回值-1左0不是中文字符1右#用法*$athisis中文;printis_chinese($a
/*
我们在处理中文数据时,经常要处理一些情况,下面就是针对
这些情况,我做的一些函数,已经用在了实践中
*/
# 判断某个位置是中文字符的左还是右半部分,或不是中文
# 返回值 -1 左 0 不是中文字符 1 右
# 用法
/*
$a = 'this is 中文';
print is_chinese($a, 1); // 0
print is_chinese($a,8); // -1
print is_chinese($a,9); // 1
*/
function is_chinese(&$str, $location) {
$ch = true;
$i = $location;
while(ord($str[$i])>0xa0 && $i >= 0) {
$ch = !$ch;
$i --;
}
if($i != $location) {
$f_str = $ch ? 1: -1;
}
else {
$f_str = false;
}
return $f_str;
}
# 中文字符串倒置函数
# 如果一个将一个有中文的字符串用strrev倒过来,就会产生乱码
/*
print cstrrev('this is 中文'); // 文中 si siht
*/
function cstrrev(&$str) {
$lOng= strlen($str);
for($f_str=', $chinese=false, $i=$long-1; $i>=0; $i--) {
if(ord($str[$i]) > 0xa0) {
$chinese = ! $chinese;
if($chinese == false) {
$f_str .= $str[$i].$str[$i+1];
}
}
else {
$f_str .= $str[$i];
}
}
return $f_str;
}
/* 中文字符串截取函数
一些中文字符串截取函数经常有一些问题,例如在一些自动换行程序中
$a=“1中2”;
经两次截取后,
csubstr($str,$a,0,2);
csubstr($str, $a, 2,2)
由于载取位置指向“中”的右字节,可能会是这样的结果
1, 2
用本函数会产生正确的结果
1中, 2
*/
# start 开始位置,从0开始
# lOng= 0 则从start 一直取到字符串尾
# ltor = true 时从左到右取字符,false 时到右到左取字符
# $cn_len 中文字符按字节取还是字数取,如果按字数取,则一个中文当一个字节计算
function csubstr(&$str, $start=0, $lOng=0, $ltor=true, $cn_len=2) {
if($lOng== 0) $lOng= strlen($str);
if($ltor == false) $str = cstrrev($str);
if($cn_len == 1) {
for(&#36;i=0, &#36;fs=0; &#36;i<&#36;start; &#36;fs++)
&#36;i += (ord(&#36;str[&#36;fs]) <= 0xa0) ? 1 : 0.5;
for(&#36;i=0, &#36;fe=&#36;fs; &#36;i<&#36;long; &#36;fe++)
&#36;i += (ord(&#36;str[&#36;fe]) <= 0xa0) ? 1 : 0.5;
&#36;lOng= &#36;fe - &#36;fs;
&#125;
else &#123;
&#36;fs = (is_chinese(&#36;str, &#36;start) == 1) ? &#36;start - 1 : &#36;start;
&#36;fe = &#36;long + &#36;start - 1;
&#36;end = ( is_chinese(&#36;str, &#36;fe) == -1 ) ? &#36;fe -1 : &#36;fe;
&#36;lOng= &#36;end - &#36;fs + 1;
&#125;
&#36;f_str = substr(&#36;str, &#36;fs, &#36;long);
if(&#36;ltor == false) &#36;f_str = cstrrev(&#36;f_str);
return &#36;f_str;
&#125;
# 取左字符串
# 当cn_len == 2 时 &#36;long 取左边多少个字,反之则取左边多少个字节
function cleft(&&#36;str, &#36;long, &#36;cn_len=2) &#123;
&#36;f_str = csubstr(&#36;str, 0, &#36;long, true, &#36;cn_len);
return &#36;f_str;
&#125;
# 取右字符串
function cright(&&#36;str, &#36;long, &#36;cn_len=2) &#123;
&#36;f_str = cstrrev(&#36;str);
&#36;f_str = csubstr(&#36;f_str, 0, &#36;long, true, &#36;cn_len);
&#36;f_str = cstrrev(&#36;f_str);
return &#36;f_str;
&#125;
# 对含有中文字符的文章分行格式化
# 再也不会发生因换行问题而产生的种种问题啦!!!
# 注:文章的每一行必须用 n (chr(13))进行分行
# &#36;width 每行多少字符
# &#36;br 将 每行用什么字符当结束符
function ctext_wrap(&&#36;text, &#36;width=60, &#36;br="
") &#123;