IT技术博客大学习 共学习 共进步

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

标点符 2010-04-06 13:54:46 浏览 3,625 次

下面的代码是来自于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. Vim 中截取部分内容保存到其他文件 (阅读 7,083)
  2. windows下压缩包在linux解压乱码的解决办法 (阅读 5,304)
  3. Linux screen窗口中文乱码问题 (阅读 5,286)
  4. linux下vim的编译以及终端乱码的最终解决方案 (阅读 4,743)
  5. java中文乱码解决之道(六)—–javaWeb中的编码解码 (阅读 4,144)
  6. PHP截取图片的某个区域 (阅读 3,704)
  7. java中文乱码解决之道(一)—–认识字符集 (阅读 3,643)
  8. 解决PHPMailer邮件标题中文乱码 (阅读 3,544)
  9. 如何在PHP下载文件名中解决乱码 (阅读 3,463)
  10. Smarty截取中文乱码的解决办法 (阅读 3,325)