$neiron='你好呀,呵呵,还有1天就过生生日喽!';
echo strlen($neiron).'<br><br>';
echo substr($neiron,0,10).'<br><br>';
输出结果为:
32你好呀,呵?br>我想要的结果,输出字符串长度时,是无论是1个数字还是1个文字都按1计算,
取指定长度字符串时也是如此  该用什么函数如何操作? 
谢谢!

解决方案 »

  1.   

    可以的话就用mb_系列
    $neiron='你好呀,呵呵,还有1天就过生生日喽!';
    echo mb_strlen($neiron,'utf-8').'<br><br>';
    echo mb_substr($neiron,0,10,'utf-8').'<br><br>';
      

  2.   

    if (function_exists('mb_substr'))
    {
     echo mb_substr($neiron, 0, 10, "utf-8");
    }
    else if(function_exists('iconv_substr'))
    {
     echo iconv_substr($neiron, 0, 10, "utf-8");
    }
      

  3.   

    可是结果还是不对呀.$neiron='你好呀,呵呵,还有1天就过生日喽!';
    echo $neiron.'<br><br>';
    echo mb_strlen($neiron,'utf-8').'<br><br>';
    echo mb_substr($neiron,0,10,'utf-8').'<br><br>';输出结果为:你好呀,呵呵,还有1天就过生日喽!18你好呀,呵呵,还计算字符数时候 为什么输出是18个字符  我怎么数也没数出18呀. 是17个字呀!
    就算是18 与我数的相差是1.
    可在取10个字符的时候为什么 输出我数是 8 个呀 
    与我数的又差两个了.
    不明白!
      

  4.   


    //截取字符串
    function csubstr($str,$start,$len)
    {
    $strlen = strlen($str);
    $clen = 0;
    $tmpstr = '';
    for($i = 0; $i < $strlen; $i++, $clen++){
    if($clen >= $start+$len){
    break;
    }
    if(ord(substr($str,$i,1)) > 0xa0){
    if ($clen   >=   $start){
    $tmpstr .= substr($str,$i,2);
    }
    $i++;
    }else{
    if($clen >= $start){
    $tmpstr .= substr($str,$i,1);
    }
    }
    }
    return $tmpstr;
    }
      

  5.   

    编码要统一你要把内容保存为utf-8格式
    或者是,"utf-8"改成你的编码,通常GBK
      

  6.   

    加第三个参数是提醒你,$neiron串须为utf-8编码。
      

  7.   

    如果$neiron串是gbk编码,就相应改成
    echo mb_strlen($neiron,'gbk').'<br><br>';
      

  8.   

    五楼的 (妖言惑众) 解决了取指定长度字符串问题.  很厉害!五楼的朋友函数里面包含的的取字符串总长度的计算不是我想要的.得不出正确的结果.现在只剩一个问题了  取字符串总长度问题 谁在帮忙一下.$neiron='你好呀,呵呵,还有1天就过生日喽!';怎么计算出neiron是 17 个字符.
      

  9.   

    $neiron = '你好呀,呵呵,还有1天就过生日喽!';
    echo $neiron.'<br><br>';
    echo iconv_strlen($neiron,'gbk').'<br><br>';
    echo iconv_substr($neiron,0,10,'gbk').'<br><br>';你好呀,呵呵,还有1天就过生日喽!17你好呀,呵呵,还有1*********$neiron = iconv('gbk', 'utf-8', '你好呀,呵呵,还有1天就过生日喽!');
    echo $neiron.'<br><br>';
    echo iconv_strlen($neiron,'utf-8').'<br><br>';
    echo iconv_substr($neiron,0,10,'utf-8').'<br><br>';你好呀,呵呵,还有1天就过生日喽!17你好呀,呵呵,还有1*****
    $neiron = iconv('gbk', 'utf-8', '你好呀,呵呵,还有1天就过生日喽!');
    echo $neiron.'<br><br>';
    echo mb_strlen($neiron,'utf-8').'<br><br>';
    echo mb_substr($neiron,0,10,'utf-8').'<br><br>';你好呀,呵呵,还有1天就过生日喽!17你好呀,呵呵,还有1
      

  10.   

    你如果使用#5的代码,请注意,此函数只适用于是GBK编码的情况。
      

  11.   


    <?php
    //截取字符串,带有汉字类型,一个汉字类型的长度为1
    function sub_string($str = '', $start = 0, $sublen = 0){
    if(strlen($str) == 0){
    echo 'function sub_string param is null';exit;
    }
    $l = strlen('测');
    $char_type = 'utf-8';
    if($l == 2){
    $char_type = 'gbk';
    }
    $str = mb_substr($str, $start, $sublen, $char_type);
    return $str;
    }//获取字符串的长度,包含汉字,每个汉字类型的长度为1
    function get_str_len($str = ''){
    if(strlen($str) == 0){
    echo 'function get_str_len param is null';exit;
    }
    $l = strlen('测');
    $char_type = 'utf-8';
    if($l == 2){
    $char_type = 'gbk';
    }
    $strlen = mb_strlen($str, $char_type);
    return $strlen;
    }
    $s = '你好呀,呵呵,还有1天就过生日喽!';
    $l = get_str_len($s);
    echo $l?>不过什么编码通用