IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

PHP截取汉字出现乱码的解决方法

标点符 2010-04-06 13:54:46 累计浏览 3,760 次
本机暂存

下面的代码是来自于Sablog(http://www.sablog.net/

以下是代码片段:
function trimmed_title($text, $limit=12) {
 if ($limit) {
  $val = csubstr($text, 0, $limit);
  return $val[1] ? $val[0]."..." : $val[0];
 } else {
  return $text;
 }
}
 
以下是代码片段:
function csubstr($text, $start=0, $limit=12) {
 if (function_exists(’mb_substr’)) {
  $more = (mb_strlen($text, ’UTF-8’) > $limit) ? TRUE : FALSE;
  $text = mb_substr($text, 0, $limit, ’UTF-8’);
  return array($text, $more);
 } elseif (function_exists(’iconv_substr’)) {
  $more = (iconv_strlen($text) > $limit) ? TRUE : FALSE;
  $text = iconv_substr($text, 0, $limit, ’UTF-8’);
  return array($text, $more);
 } else {
  preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $text, $ar);  
  if(func_num_args() >= 3) {  
   if (count($ar[0])>$limit) {
    $more = TRUE;
    $text = join("",array_slice($ar[0],0,$limit))."...";
   } else {
    $more = FALSE;
    $text = join("",array_slice($ar[0],0,$limit));
   }
  } else {
   $more = FALSE;
   $text =  join("",array_slice($ar[0],0));
  }
  return array($text, $more);
 }
}

于是就有人提炼成:

以下是代码片段:
function csubstr ($text, $limit) { 
$s = ’’; 
for($i=0;$i< $limit-3;$i++) { 
$s .= ord($text[$i])>127 ? $text[$i].$text[++$i] : $text[$i]; 
} 
return $s; 
}

以上仅适用于gb2312 编码(gb2312中,一个汉字占两个字节),如果是UTF-8(UTF-8中一个汉字占三个字节)需要把第4行改为:

以下是代码片段:
$s .= ord($text[$i])>127 ? $text[$i].$text[++$i].$text[++$i] : $text[$i];
原图已失效

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,267)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,162)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,407)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,146)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,788)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,539)
  7. Redis消息队列的若干实现方式 (累计阅读 12,085)
  8. 到底什么是MVC? (累计阅读 11,864)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,708)
  10. Rolling cURL: PHP并发最佳实践 (累计阅读 11,486)