<?php
/**********************************************************************
  语法: string substr_for_gb2312(string string, int start, int [length]);
  返回值: 字符串
  用法同substr();
  本函数将字符串 string 的第 start 位起的字符串取出 length 个字符。
  若 start 为负数,则从字符串尾端算起。
  若可省略的参数 length 存在,但为负数,则表示取到倒数第 length 个字符.
***********************************************************************/
//原理:国标码的编码机内码为161到255,即A0到FFfunction substr_for_gb2312($str,$start,$len=Null){
    $totlelength = strlen($str);    //特例情况
    if ($len == null) $len = $totlelength;
    if ($len ==0) return "";
    if ($len >= $totlelength && $start == 0 ) return $str;
    if ($start > $totlelength) return "";    //分析$start
    if ($start < 0 )//$start<0时,转化为$start>0时的定位.
    {
        if ( abs($start) >= $totlelength ) $start = 0;
        else $start = $totlelength - abs($start);
     }
    //确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.
    if ($start > 0)
    {
        $i = $start-1;        $flag = -1;        while ($i >= 0)
        {
            if ( ord(substr($str,$i,1)) > 160)
            {
               $flag = -1*$flag;
            }
            else break;
            $i--;
        }
        if($flag==1)
        {
            $start = $start - 1;
            $len++;  //保证不位移.
        }
    }    $str = substr($str,$start);//截除字符串$str的$start位前的字符
    $totlelength = strlen($str);    //确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.
    if ($len<0) $len = $totlelength - abs($len);
    if ($len <= 0) return "";
    $i=min($len,$totlelength);
    $i--;
    $flag = -1;
    while ($i >= 0){
        if (ord(substr($str,$i,1))>160){
            $flag=-1*$flag;
        }else break;
        $i--;
    }
    if($flag == 1)$len=$len-1;
    $subit=substr($str,0,$len);
    return $subit;
}?>