努力思考 + 实践, 眼高手低是不行的. 注册 | 登陆

字符截取中文防乱码 .chr(0) 解决一切

PHP代码
  1. <?php    
  2.   
  3. $len = 19;    
  4.   
  5. $text = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";    
  6. echo strlen($text)<=$len ? $text : (substr($text,0,$len).chr(0)."....");    
  7. ?>   

chr(0)不是null
null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000
虽然chr(0)不会显示出什么,但是他是一个字符。
当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空”
根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了


注:
编码 第一字节 第二字节
gb2312 0xa1-0xf7 0xa1-0xfe
gbk 0x81-0xfe 0x81-0xfe 0x40-0x7e
big5 0xa1-0xf7 0x81-0xfe 0x40-0x7e

另一种方法: 

PHP代码
  1. function csubstr($text$limit) {    
  2.     $s = ';    
  3.     for($i=0;$i$limit-3;$i++) {    
  4.         $s .= ord($text[$i])>127 ? $text[$i].$text[++$i] : $text[$i];    
  5.     }    
  6.     return $s;    
  7. }   

以上仅适用于 gb2312 编码,如果是UTF-8 的话需要把第4行改为 

PHP代码
  1. $s .= ord($text[$i])>127 ? $text[$i].$text[++$i].$text[++$i] : $text[$i];   

UTF-8 中的汉字是 3 个字节。

Tags: php, 技巧

« 上一篇 | 下一篇 »

只显示5条记录相关文章

Notepad++运行PHP, Python (浏览: 4015, 评论: 0)
守护进程删除smarty的缓存文件(注释版) (浏览: 3429, 评论: 0)
Php ini_set ini_get可操作配置参数列表 (浏览: 9137, 评论: 1)
资料备忘,保持更新。 (浏览: 6039, 评论: 0)
40个迹象表明你还是PHP菜鸟 (浏览: 4218, 评论: 2)

Trackbacks

点击获得Trackback地址,Encode: UTF-8

3条记录访客评论

最好的办法是使用mb扩展库的mb_substr函数

Post by linln on 2008, February 14, 10:22 AM 引用此文发表评论 #1

@linln: 这个知道哈, 忘记加上去了.

Post by zwws on 2008, February 14, 3:49 PM 引用此文发表评论 #2

第一种方法不错,很简洁,以前我一直都用判断ascll码的方式来截,不过太麻烦了

Post by 星野天河 on 2008, August 3, 11:24 AM 引用此文发表评论 #3


本文因为某种原因此时不允许访客进行评论