/* 我们在处理中文数据时,经常要处理一些情况,下面就是针对 这些情况,我做的一些函数,已经用在了实践中 */ # 判断某个位置是中文字符的左还是右半部分,或不是中文 # 返回值 -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($i=0, $fs=0; $i