在我们用PHP开发网站的过程中对于中文字符的截取是一个常用到的功能,在PHP的库函数中已经存在substr()来截取字符,但是如果我们对于中文汉字也是直接用这个函数来进行操作的话,那么我们得到的结果有时就是一个非正确的结果。

  问题的关键就是substr()是按照字符的字节数目来进行截取的,对于英文字符,由于每个因为字符都是一个字节,因此在使用这个函数时我们可以正确的获得结果。基于这样的想法,我们可以设想,任何语言,如果其单个字符都是一个字节,则用substr()都可以正确地获得一个正确的截取结果。

  而对于汉字就不一样,因为我们的汉字是两个字节,因此如果对于其中的一个汉字进行截取,如果我们截取了其中的一个字节,那么这个汉字就不在完全,则就会得到一个错误的结果。

  因此我们要写一个自己的substr()函数,在我们进行算法设想之前我们应该了解我们的汉字编码的一些知识。

  在汉字编码中,我们是按照区的标准来分类汉字的,01–09区是特殊符号;16–55区位一级汉字;56–87区位二级汉字;10–15和88–94区没有编码。而汉字的存储结构为:

高字节(0xA1—0xF7)—-01–87区的区号+oxA0
低字节(oxA1—oxFE)—01–94区的区号+0xA0

因此我们判断一个字节是否为汉字的一部分的理论基础就是:
ord($str,$i,1)>oxA0
而这也是我们改进substr()函数的关键。

没有相关文章.