当前位置: 首页 > 编程笔记 >

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

印晋
2023-03-14
本文向大家介绍PHP中文字符串截断无乱码解决方法,包括了PHP中文字符串截断无乱码解决方法的使用技巧和注意事项,需要的朋友参考一下

一个比较好用的字符串截取函数:

function substring($str, $start, $length){ //比较好用字符串截取函数
  $len = $length;
  if($length < 0){
  $str = strrev($str);
  $len = -$length;
  }
  $len= ($len < strlen($str)) ? $len : strlen($str);
  $tmpstr = "";
  for ($i= $start; $i < $len; $i ++)
  {
      if (ord(substr($str, $i, 1)) > 0xa0)
      {
       $tmpstr .= substr($str, $i, 2);
       $i++;
      } else {
       $tmpstr .= substr($str, $i, 1);
      }
  }
  if($length < 0) $tmpstr = strrev($tmpstr);
  return $tmpstr;
}

使用方法示例:

$str1 = '我是一串比较长的中文不带英文';
$str2 = '我是一串比较长的中文带yingwen';


$len = strlen($str1);
echo '<br />'.$len; //return 28

$len = strlen($str2);
echo '<br />'.$len; //return 29

echo '<br />';  
echo substring($str1, 0, 11);  
echo '<br />';
echo substring($str2, 0, 11);    
echo '<br />';
echo substring($str1, 16, 28);  
echo '<br />';
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 < $len; $i++) {
    $x = substr($str, $i, 1);
    $a = base_convert(ord($x), 10, 2);
    $a = substr('00000000'.$a, -8);
    if (substr($a, 0, 1) == 0) {
    }elseif (substr($a, 0, 3) == 110) {
      $i += 1;
    }elseif (substr($a, 0, 4) == 1110) {
      $i += 2;
    }
    $n++;
  }
  return $n;
} // End strlen_UTF8;

字符串截断函数:

function subString_UTF8($str, $start, $lenth)
  {
    $len = strlen($str);
    $r = array();
    $n = 0;
    $m = 0;
    for($i = 0; $i < $len; $i++) {
      $x = substr($str, $i, 1);
      $a = base_convert(ord($x), 10, 2);
      $a = substr('00000000'.$a, -8);
      if ($n < $start){
        if (substr($a, 0, 1) == 0) {
        }elseif (substr($a, 0, 3) == 110) {
          $i += 1;
        }elseif (substr($a, 0, 4) == 1110) {
          $i += 2;
        }
        $n++;
      }else{
        if (substr($a, 0, 1) == 0) {
          $r[ ] = substr($str, $i, 1);
        }elseif (substr($a, 0, 3) == 110) {
          $r[ ] = substr($str, $i, 2);
          $i += 1;
        }elseif (substr($a, 0, 4) == 1110) {
          $r[ ] = substr($str, $i, 3);
          $i += 2;
        }else{
          $r[ ] = '';
        }
        if (++$m >= $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中实现中文字串截取无乱码的解决方法,包括了PHP中实现中文字串截取无乱码的解决方法的使用技巧和注意事项,需要的朋友参考一下 在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr的长度参数是按照字节去算的,在GB2312编码时,一个中文占2个字节,英文为1个字节,而在UTF-8编码当中,一个中文可能占有

  • 本文向大家介绍PHP中iconv函数转码时截断字符问题的解决方法,包括了PHP中iconv函数转码时截断字符问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 iconv是转换编码的,但是在中文转码时候出现显示不全问题。    或者用mb_convert_encoding()   保险就用mb_conver_encoding 

  • 本文向大家介绍PHP实现截取中文字符串不出现?号的解决方法,包括了PHP实现截取中文字符串不出现?号的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现截取中文字符串不出现?号的解决方法。分享给大家供大家参考,具体如下: 当PHP截取中英文混合字符串时,最后一个汉字经常被拆成两半,例:截取字符串的前18个字 输出为结果为: 于是写了以下这段代码,判断如果中英文混合字符串中的

  • 本文向大家介绍PHP读MYSQL中文乱码的快速解决方法,包括了PHP读MYSQL中文乱码的快速解决方法的使用技巧和注意事项,需要的朋友参考一下 打算切换某个网站的主机,没想到遇到Php和Mysql中文乱码的问题。 以前的国外主机用的Mysql是4.x系列的,感觉还比较好,都无论GBK和UTF-8都没有乱码,没想到新的主机的Mysql是5.0版本的,导入数据后,用Php读出来全是问号,乱码一片,记得

  • 本文向大家介绍php使用iconv中文截断问题的解决方法,包括了php使用iconv中文截断问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php使用iconv中文截断问题的解决方法。分享给大家供大家参考。具体分析如下: 今天做了一个采集程序,原理很简单,使用curl方法把对方页面的html获取分析,然后正则提取需要的数据并保存在数据库。 由于对方页面是GB2312编码,而本

  • 本文向大家介绍php写入mysql中文乱码的实例解决方法,包括了php写入mysql中文乱码的实例解决方法的使用技巧和注意事项,需要的朋友参考一下 php写入mysql出现中文乱码的解决办法是:在建立数据库连接之后,将该连接的编码方式改为中文。 代码如下: 继续上面的问题,查看一下Apache目录下的PHP源文件,发现页面的编码方式是ANSI的,于是乎,我改成了utf8格式的。然后在执行SQL语句

  • 本文向大家介绍php中文字符串截取多种方法汇总,包括了php中文字符串截取多种方法汇总的使用技巧和注意事项,需要的朋友参考一下 1. 截取GB2312中文字符串 2. 截取utf8编码的多字节字符串 3. UTF-8、GB2312都支持的汉字截取函数 4. BugFree 的字符截取函数 以上就是本文的全部内容,希望对大家有所帮助,希望大家继续关注呐喊教程的最新内容。

  • 本文向大家介绍运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题),包括了运行vbs脚本报错无效字符、中文乱码的解决方法(编码问题)的使用技巧和注意事项,需要的朋友参考一下 代码没有问题,总是报这样的错误。 测试代码 很简单的代码,但如果编码不对问题就很多 中文乱码问题 运行图 因为使用了utf8编码导致,因为我先用的记事本编写的 无效字符 -------------------------