PDA

查看完整版本 : 請教程式語言 (PHP) 達人


domainplayer
2005-10-04, 10:44 PM
請教一下各位,
我發現我架的那支二手市場PHP有一個嚴重的bug

原因是下面這段程式碼:

if(strlen($title)>15) $title=substr($title,0,15)."...";

這段碼的作用是當我輸入的拍賣物title超過15個字元時
它在首頁顯示時會自動將第16個字之後省略為"..."

也就是當我輸入"12345678910111213141516" (23個字元),
經由這段程式碼的作用會變成"123456789101112..." (15個字元+"...")

但由於一個中文字等於2字元,
當我輸入"一二三四五六七八" (16字元)時
經由這段程式碼作用後會變成"一二三四五六七?..." (15字個字元+"...")
因為第15與16字元共同組成了"八"這個中文字,
但由於第16個字元後面都被省略了...
所以該拍賣訊息第15個字元會成為"?"(問號)
請參見 http://www.bazaar.info

請問有沒有辦法設定遇到第15個字元是中文字時,
此程序會變為第17個字元後才省略成"..."
或是有沒有其它辦法能解決這個問題?

希望懂的人能幫忙, 拜託拜託! :bow

ras0314
2005-10-04, 10:49 PM
if(strlen($title)>15) $title=substr($title,0,15)."...";

會不會只要把15改大就好了阿??

domainplayer
2005-10-04, 10:51 PM
if(strlen($title)>15) $title=substr($title,0,15)."...";

會不會只要把15改大就好了阿??
改大了之後還是會有相同問題,
例如把15改成16後,
輸入"A一二三四五六七八"(17字元)
由於"八"變成由第16與17字元所組成,
在首頁顯示時還是會變成"A一二三四五六七?..."

ras0314
2005-10-04, 11:00 PM
那把15改成50不就可以輸入25個中文字了嗎 ^^

domainplayer
2005-10-04, 11:24 PM
那把15改成50不就可以輸入25個中文字了嗎 ^^
二十五個字就超過我的版面設定了.... :shutup

game.tw
2005-10-04, 11:53 PM
我只懂道理,不知怎麼回答....
字串 >= 16時 取15碼+"..."
但第15碼為中文的 "第一碼" 時,會變 ? 號
程式中,應該在上面的判斷式成立時,
再判斷第15個字元的ASC II碼 是否大於中文在ASC II中的編碼
若為真,則取14碼 + "..."
若為否,則取15碼以內

PHP應該有函數可以判斷字串中,某一位置的ASC II碼吧...
若無法直接判斷...
那就用一個 "變數 = 第15碼"
再用 ASC II的函數,來判斷他在ASC II中的編碼
應該就可以了

wmh
2005-10-05, 12:56 AM
中文字第一碼和第二碼的 ASCII 都有可能超過 128,無法直接判斷出某字元是否屬於中文的第一碼。要判斷的話可試試由字串前頭開始一個個字元去判斷,遇到 ASCII 大於 128 則視為中文字的第一碼,則下一個字元視為中文字第二碼,依此方式繼續判斷下去,則可知道第 15 個字元是否為中文字第一碼。除非字串中用到特殊字元,否則通常結果會是正確的。

ckmarkhsu
2005-10-05, 01:42 AM
dp老大你那支程式是什麼編碼

我把模組copy給你....你替換上去就OK了

這是中文典型的問題...

virileman
2005-10-05, 08:29 AM
小弟喜歡使用 萬國碼 utf-8 ,字元數都統一 ,然後用 mb_substr() 此 funtion 來切割字串即不會有上述問題

ckmarkhsu
2005-10-05, 07:03 PM
mb_substr好像要mbstring.dll這個模組才能支援...

domainplayer
2005-10-05, 08:42 PM
感謝各位高手的回覆!!
我考慮之後還是決定不用有"..."的標題,
直接使用完整title當拍賣標題.

再次感激各位大大!!!
本小站即將開站. :bow

青狼
2005-10-08, 01:41 AM
<?

$tit="一二三四五六七八";
$pack="";
$cnt=10; //擷取的字串數
for($x=0;$x<strlen($tit);$x++)
{
if(ord(substr($tit,$x,1))>128)
{
$pack=$pack.substr($tit,$x,2);
$x++;
}Else{
$pack=$pack.substr($tit,$x,1);
}
$cnt--;
if($cnt<=0)
Break;
}

echo "$pack..."

?>

試試這是不是你要的^^