裸奔的鸡蛋 发表于 2011-8-1 17:12:43

自动识别汉字的PHP截取字符串函数(utf8、GBK和GB2312有效

/***************************************************************************


002 函数功能:截取GB2312以及GBK编码的字符串,可以设置截取位置和长度,2个长度代表一个汉字

003 $str------------截取源字符串

004 $start----------起始位置,不能为空,从1算起

005 $len------------截取长度(2代表一个汉字),如果为空则截取到字符串末尾

006 主意:该函数不能用于utf8编码字符串,会出现乱码

007 ***************************************************************************/

008 function substr_for_gb2312($str,$start,$len=null)

009 {

010   $totlelength = strlen($str);

011      

012   //特例情况

013   if ($len == null) $len = $totlelength;

014   if ($len ==0) return "";

015   if ($len >= $totlelength && $start == 0 ) return $str;

016   if ($start > $totlelength) return "";

017      

018   //分析$start

019   if ($start < 0 ) //$start<0时,转化为$start>0时的定位.

020   {

021         if ( abs($start) >= $totlelength )

022             $start = 0;

023         else

024             $start = $totlelength - abs($start);

025   }

026   

027   //确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.

028   if ($start > 0)

029   {

030         $i = $start-1;

031         $flag = -1;

032         while ($i >= 0)

033         {

034             if ( ord(substr($str,$i,1)) > 160)

035             {

036               $flag = -1*$flag;

037             }

038            else break;

039             $i--;

040         }

041         if($flag==1)

042         {

043             $start = $start - 1;

044             $len++; //保证不位移.

045         }

046   }

047   

048   $str = substr($str,$start);//截除字符串$str的$start位前的字符

049   $totlelength = strlen($str);

050      

051   //确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.

052   if ($len<0) $len = $totlelength - abs($len);

053   if ($len <= 0) return "";

054   $i=min($len,$totlelength);

055   $i--;

056   $flag = -1;

057   while ($i >= 0)

058   {

059         if (ord(substr($str,$i,1))>160)

060         {

061             $flag=-1*$flag;

062         }

063         else break;

064         $i--;

065   }

066      

067   if($flag == 1)$len=$len-1;

068   $subit=substr($str,0,$len);

069      

070   return $subit;

071 }

072   

073 /***************************************************************************

074 函数功能:截取GB2312以及GBK编码的字符串,从第一个字符开始截取,2个长度代表一个汉字

075 $str------------截取源字符串

076 $len------------截取长度(2代表一个汉字)

077 主意:该函数不能用于utf8编码字符串,会出现乱码

078 ***************************************************************************/

079 function splitStr($str,$len)

080 {

081   if($len<=0)

082   {

083         return false;

084   }

085   else

086   {

087         $sLen=strlen($str);

088         if($len>=$sLen)   

089             return $str;

090         else

091         {

092             for($i=0;$i<($len-1);$i++)

093             {

094               if(ord(substr($str,$i,1))>0xa0)

095                     $i++;

096             }

097               

098             if($i>=$len)

099               return substr($str,0,$len);

100             elseif(ord(substr($str,$i,1))>0xa0)

101               return substr($str,0,$len-1);

102             else

103               return substr($str,0,$len);

104         }

105   }

106 }

107   

108   

109 /***************************************************************************

110 函数功能:截取utf8或GB2312或者GBK编码的字符串,从第一个字符开始截取,1个长度代表一个汉字

111 $sourcestr------------截取源字符串

112 $cutlength------------截取长度(字数)

113 这个函数很万能,但是相对前两个耗资源一些

114 ***************************************************************************/

115 function substr_for_utf8($sourcestr,$cutlength)

116 {

117   $returnstr='';

118   $i=0;

119   $n=0;

120   $str_length=strlen($sourcestr); //字符串的字节数

121   while (($n<$cutlength) and ($i<=$str_length))

122   {

123         $temp_str=substr($sourcestr,$i,1);

124         $ascnum=Ord($temp_str); //得到字符串中第$i位字符的ascii码

125         if ($ascnum>=224) //如果ASCII位高与224,

126         {

127             $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符         

128             $i=$i+3; //实际Byte计为3

129             $n++; //字串长度计1

130         }

131         elseif ($ascnum>=192)//如果ASCII位高与192,

132         {

133             $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符

134             $i=$i+2; //实际Byte计为2

135             $n++; //字串长度计1

136         }

137         elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,

138         {

139             $returnstr=$returnstr.substr($sourcestr,$i,1);

140             $i=$i+1; //实际的Byte数仍计1个

141             $n++; //但考虑整体美观,大写字母计成一个高位字符

142         }

143         else //其他情况下,包括小写字母和半角标点符号,

144         {

145             $returnstr=$returnstr.substr($sourcestr,$i,1);

146             $i=$i+1;    //实际的Byte数计1个

147             $n=$n+0.5;//小写字母和半角标点等与半个高位字符宽...

148         }

149   }

150      

151   if ($str_length>$cutlength)

152   {

153         $returnstr = $returnstr . "...";    //超过长度时在尾处加上省略号

154   }

155      

156   return $returnstr;

157 }

158   

159   

160 ?>
http://www.shuihan.com/article/146



噘囜饴缗 发表于 2011-8-23 01:42:52

支持~~顶顶~~~


















static/image/common/sigline.gif
正味网为您推荐[探索]--工程大突破第五季

裸奔的鸡蛋 发表于 2011-8-23 15:24:47

噘囜饴缗 发表于 2011-8-23 01:42 static/image/common/back.gif
支持~~顶顶~~~




{:3_43:}

68mn427N 发表于 2011-9-2 13:34:03

爱情其实是一种习惯回你习惯生活中有他◎他习惯生活中有你。拥有的时候不觉得什么◢一旦失去□却仿佛失去了所有。
                                               
                       
                       
                       
                       
                       
                       
                       
                       











static/image/common/sigline.gif
影视界为您推荐[其它]--DERO密室游戏大脱逃

waka417800 发表于 2011-9-24 11:01:18

大家顶啊,这么好的帖子,楼主辛苦了











static/image/common/sigline.gif
アルバイト   ビジネス英語    TOEIC    アダルト

尧忏议_RKt 发表于 2011-9-30 15:45:50

顶一个先吧











static/image/common/sigline.gif

注册并发布信息日*赚N元   注册地址:http://www.baixing.com/?u=58493516

风云福灿 发表于 2011-10-8 14:35:48

谢谢分享哈











static/image/common/sigline.gif

http://img2081.poco.cn/mypoco/myphoto/20110822/16/64165363201108221627279573116820626_003.jpg

tjnpx 发表于 2012-1-4 16:33:48

  牛皮癣是一种顽固的皮肤病,最简洁明了的影响就是危害心理健康,给患者带来沉重的思想压力。对生理的影响也是不能小窥的,久病则可直接影响患者的肝、肺、肾等脏器及其功能,并遗传后代。它不仅给患者肉体上带来痛苦,更使正常人对患者产生厌恶及躲避心理。给患者的生活、社会交际中带来很大障碍,从而在精神上造成沉重的思想负担,给患者增加了不可言喻的痛苦。   
  牛皮癣秋冬季高发且患者手脚冰冷,不知道是什么原因造成的?很多患者和家庭对牛皮癣的发病原因始终不明确,从而导致牛皮癣反复发作,那么究竟是什么牛皮癣医院原因诱发牛皮癣?

yue321123 发表于 2012-2-5 15:51:32

黑斗篷老者深深吸了一口气:“最后一个问题,R国某军界首脑在家悬梁自尽,警方分析这件凶案绝非**。说来说去,此事大概也与阁下不无关系吧?”
      武星河哈哈一笑:“你是说那个比猪还肥的军界巨头吗?不错,那人是我杀的。那厮人面猪相,一张破嘴把不住门,成天胡说八道。我看他不顺眼不是一天两天了。这次居然号称要以武力强占我华夏领土通吃岛,岂不该死?”
      忽然,武星河紧盯着老者胸口那一朵带血蔷薇,哑然失笑起来:“我说,什么时候,食血蔷薇组织开始干起世界JC的勾当了?莫非以你们的臭名昭著,还想玩一把正义不成?”
      老者眯着眼睛,阴森森笑道:“正义这种东西,在我们地下世界里,一文不名。不怕告诉你,有人出了五十亿美金要你的命。在我们眼里,你干过什么并不重要;重要的是,取到你的人头,可以得到一张五十亿美金的支票。”
      “五十亿美金?”武星河倒没想到,他如今的身价,竟然能涨到这么变态的地步,不过转念一想,念头也便通达了。
      他此前干下的这一桩桩案子,每一件事都可以上升到政治高度,那么这件案子的背后,出现国家意志也就不希奇了。河南白癜风治疗最好医院
      既然出现国家意志,那么再高的酬金也便不难理解了。
      事实也是如此,如此天价高额的酬金,其背后的委托方,其实已经超出了个人甚至是财团的承受范围!

小东 发表于 2012-3-7 09:55:17

这些货中有小亚细亚的羊毛、细麻、羊皮纸、蜂蜜、地毯和油类,本地生产的玻璃、无花果、胡桃、香精、帕尔迈拉岛的衣料和药材,阿拉伯的生姜、肉桂和宝石,埃及的玉米、纸张、花岗岩、雪花石膏和黑色瓷器,巴比伦的挂毯,罗马的油画,以及希腊的雕像。空气中弥漫着香精的气味,海菲敏感的鼻子还闻到了香甜的李子、苹果、乳酪和生姜的味道。

页: [1] 2
查看完整版本: 自动识别汉字的PHP截取字符串函数(utf8、GBK和GB2312有效