关于如何做这个题的算法我是清楚的,但是就有关于ord函数的一些原理问题不能理解,请大神帮忙解释一下,通俗易懂最好,本人新手。
<?php
 function chinesesubstr($str,$start,$len)
 {
     $strlen=$start+$len;          //判断截取的长度
     for($i=start;$i<$strlen.lenth;$i++)
     {
         if (ord(substr($str, $i,1))>0xa0)
         { 
             $word.=substr($str,$i,2);
             $i++;               
         }
         else 
            $word.=substr($str,$i,i);
     }
     return $word;
 }
?>我们可以看到,这段代码再第一个判断语句if (ord(substr($str, $i,1))>0xa0)
中,substr($str,$i,1) substr函数截取的长度只有一个字节。小弟在网上了解了一下,汉字在GB2312的标准里面是2个字节长度,所以第一个问题: 因为ord()函数只是判断一个字符串第一个字符的ASCII码,意思是只判断这个汉字的第一个字节的ASCII吗?然后第二个问题:【先看一下代码】
         if (ord(substr($str, $i,1))>0xa0)
         { 
             $word.=substr($str,$i,2);
             $i++;               
         }
这边符合判断条件之后,这边的substr()函数截取的长度变为2  但是$i只有加1,这是我和不能理解的。因为汉字有两个字节长度,所以这边的$i不应该是加2吗?求大神帮忙解释一下 小弟感激不尽,新手新学,可能对一些概念还都不是很理解。求通俗易懂解释~

解决方案 »

  1.   

    ord 取得字符的内码
    GB2312标准中,1个汉字用2个字节表示,且每个字节的内码均大于 0xa0
    但在 GBK 标准中,只限定第一个字节的内码大于 0x80。这一点需要注意对于 GB2312 由于汉字固定为2个字节,所以只需检查第一个字节就可以了对于 $i只有加1 是这样的:
    因为你的操作是在 for($i=start;$i<$strlen.lenth;$i++) 这样的循环中进行的,而循环本身会将 $i 加 1
    所以在判定是汉字时,只需 $i++。加上循环本身的 $i++,不正好是加 2 了吗?