2008年8月17日 星期日

php內中文截取字串的作法mb_substr()

php內建的substr()遇到中文會有問題,所以必須改用mbstring模組來做中文截取
字串的工作。
作法如下:

<?php
$string = "這是測試的中文字";
$str = mb_substr($string, 1, 3, 'UTF8');
echo $str;
?>

顯示"是測試"三個字。

------------------------------------
使用mbstring前須先在php.ini中enable
[ 問題 ]:
找不到 PHP 內的 mbstring 編碼模組, 沒有這個模組, phpMyAdmin 無法準確地分
割雙字元文字, 而可能產生問題

解答一、
在windows目錄下的php.ini中,將
extension=php_mbstring.dll
前的分號";"拿掉,並重新啟動Apache即可

解答二、
若再不行裝phpmyadmin如果遇到此問題,必須要把原先在php/extensions/下的
php_mbstring.dll檔案複製到/windows/下,然後重新啟動apache就能
讓那一組紅字不再出現

自資料庫中取出的中文成了亂碼

在開始query的最前面加上
$charset = mysql_query("SET NAMES 'utf8'");

2008年8月1日 星期五

Smarty truncate雙位元字元的問題

使用Smarty的truncate功能取一字串的前n字,使用英文沒問題,但中文字會被誤截,出現FF, FD等字(Firefox中), 或出現亂碼(IE中)。這是php當中multi-byte的老問題。

解決辦法:

1.對php下手:
 用mbstring,請參考「LifeType的討論串」。

2.對Smarty下手:
 改smarty目錄下plugin裡modifier.truncate.php的function

 這是引用自網上phpbulo.com 的作法。
function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false)
{
 $start=0;
 $code="UTF-8";
 if($code == 'UTF-8')
 {
  $pa = "/[\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]/";
preg_match_all($pa, $string, $t_string);

  if(count($t_string[0]) - $start > $length)
   return join('', array_slice($t_string[0], $start, $length))."...";
  return join('', array_slice($t_string[0], $start, $length));
 }
 else
 {
  $start = $start*2;
  $length = $length*2;
  $strlen = strlen($string);
  $tmpstr = '';

  for($i=0; $i<$strlen; $i++)
  {
   if($i>=$start && $i<($start+$length))
   {
    if(ord(substr($string, $i, 1))>129)
     $tmpstr.= substr($string, $i, 2);
    else
     $tmpstr.= substr($string, $i, 1);
   }
   if(ord(substr($string, $i, 1))>129)
    $i++;

  }
  if(strlen($tmpstr)<$strlen )    $tmpstr.= "...";
  return $tmpstr;
 }
}