找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1433|回复: 0
打印 上一主题 下一主题

PHP中文字符串截断无乱码解决方法

[复制链接]

2617

主题

2617

帖子

7789

积分

论坛元老

Rank: 8Rank: 8

积分
7789
跳转到指定楼层
楼主
发表于 2018-2-14 05:32:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            一个比较好用的字符串截取函数:
function substring($str, $start, $length){ //比较好用字符串截取函数
  $len = $length;
  if($length  0xa0)
      {
       $tmpstr .= substr($str, $i, 2);
       $i++;
      } else {
       $tmpstr .= substr($str, $i, 1);
      }
  }
  if($length
使用方法示例:
$str1 = '我是一串比较长的中文不带英文';
$str2 = '我是一串比较长的中文带yingwen';
$len = strlen($str1);
echo '
'.$len; //return 28
$len = strlen($str2);
echo '
'.$len; //return 29
echo '
';  
echo substring($str1, 0, 11);  
echo '
';
echo substring($str2, 0, 11);   
echo '
';
echo substring($str1, 16, 28);  
echo '
';
echo substring($str2, 16, 29);  
结果显示:
28
29
我是一串比较
我是一串比较
中文不带英文
中文带yingwen
这个函数十分有用,比如用来截断比较长的文件名,但是要在中间加上...,可以这样来做:
function formatName($str, $size){
  $len = strlen($str);
  if(strlen($str) > $size) {
    $part1 = substring($str, 0, $size / 2);
    $part2 = substring($str, $len - ($size/2), $len);
    return $part1 . "..." . $part2;
  } else {
    return $str;
  }
}
另外,网上看到一种超级简单的中文截断解决方案,试用了一下,效果也不错:
echo substr($str1,0,10).chr(0);
原理解释:
chr(0)不是null
07null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000
08虽然chr(0)不会显示出什么,但是他是一个字符。
09当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空”
10根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了
----------------------------
20120705更新:
以上方法虽好,但是偶尔还是会碰到乱码,原因未深究。不过可以用以下的方法,对UTF8字符文本屡试不爽。
注意:该方法中将汉字计算为1单位长度,英文一个字母1单位长度,所以截断时需要注意长度设置。
计算长度的方法:
function strlen_UTF8($str)
{
  $len = strlen($str);
  $n = 0;
  for($i = 0; $i
字符串截断函数:
function subString_UTF8($str, $start, $lenth)
  {
    $len = strlen($str);
    $r = array();
    $n = 0;
    $m = 0;
    for($i = 0; $i = $lenth){
          break;
        }
      }
    }
    return join($r);
  } // End subString_UTF8;
使用方法和之前介绍的一样,比如formatName可以实现如下(这对汉字长度做了小优化):
function formatName($str, $size){
$len = strlen_UTF8($str);
$one_len = strlen($str);
$size = $size * 1.5 * $len / ($one_len);
if(strlen_UTF8($str) > $size) {
  $part1 = subString_UTF8($str, 0, $size / 2);
  $part2 = subString_UTF8($str, $len - ($size/2), $len);
  return $part1 . "..." . $part2;
} else {
  return $str;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
            
            
您可能感兴趣的文章:
  • PHP反转字符串函数strrev()函数的用法
  • php上传文件中文文件名乱码的解决方法
  • php网页标题中文乱码的有效解决方法
  • php中json_encode处理gbk与gb2312中文乱码问题的解决方法
  • php中json_encode UTF-8中文乱码的更好解决方法
  • PHP中使用file_get_contents抓取网页中文乱码问题解决方法
  • php生成二维码时出现中文乱码的解决方法
  • PHP附件下载中文名称乱码的解决方法
  • php pdo oracle中文乱码的快速解决方法
  • php版微信公众平台回复中文出现乱码问题的解决方法
  • PHP读MYSQL中文乱码的快速解决方法
  • PHP使用strrev翻转中文乱码问题的解决方法
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端