m_substr 是啥啊,没找到嘛

解决方案 »

  1.   

    上面有啊
    function m_substr($str,$start) {
    preg_match_all("/[\x80-\xff]?./",$str,$ar);
    if(func_num_args() >= 3) {
    $end = func_get_arg(2);
    return join("",array_slice($ar[0],$start,$end));
    }else
    return join("",array_slice($ar[0],$start));
    }
      

  2.   

    楼上说的对,utf-8的汉字占3个字节.
      

  3.   

    function cut_str($sourcestr,$cutlength)
    {
    $returnstr='';
    $i=0;
    $n=0;
    $str_length=strlen($sourcestr);//字符串的字节数
    while (($n<$cutlength) and ($i<=$str_length))
    {
    $temp_str=substr($sourcestr,$i,1);
    $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
    if ($ascnum>=224) //如果ASCII位高与224,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
    $i=$i+3; //实际Byte计为3
    $n++; //字串长度计1
    }
    elseif ($ascnum>=192) //如果ASCII位高与192,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
    $i=$i+2; //实际Byte计为2
    $n++; //字串长度计1
    }
    elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,1);
    $i=$i+1; //实际的Byte数仍计1个
    $n++; //但考虑整体美观,大写字母计成一个高位字符
    }
    else //其他情况下,包括小写字母和半角标点符号,
    {
    $returnstr=$returnstr.substr($sourcestr,$i,1);
    $i=$i+1; //实际的Byte数计1个
    $n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
    }
    }
    if ($str_length>$cutlength){
    $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
    }
    return $returnstr;}
    网上找到的.我用过不错
      

  4.   

    utf8的字符编码和gbk不同,上面的函数不可用在mysql里,既然设置了字符集,直接left()就可以按字符(不是字节)截取了
      

  5.   

    用46个汉字和46个字母试了jianye112(http://hi.baidu.com/lael80)的,截取38个字,汉字可以,字母就全部显示46个,utf8的字符编码直接截取也不行啊,left()怎么用?asp里有php里没找到啊。
    46个汉字和46个字母用strlen得出汉字138,字母是46的长度,
    直接用substr截取38个汉字是得到12个加一个?号。字母就正确截取,
      

  6.   

    还有什么办法?没有就还用m_substr好了,截取25个字转一下,3/2*25=实际截取的字数,这样算了
      

  7.   

    left是在mysql里用的,到了php里,字符串是无编码的,一般那些函数很难判断字符串的编码。
    你也可以用mbstring里的函数。在mysql里
    如果你的title是utf8的,
    select left(title,8) ... 就会截取title的前8个字符,
    汉字和字母都各算一个字符,mysql的字符函数里很多都是认编码的,
    除了strlen等似乎还是算字节数。
      

  8.   

    是啊,怎麼沒想到在sql語句裡截取,晚上試試