網域名稱俱樂部


返回   網域名稱俱樂部 > 電腦與網路技術 > 電腦網路相關技術
論壇幫助 社區 日曆事件 今日新文章 搜尋

回覆
 
主題工具
  #1  
舊 2005-10-04, 10:44 PM
domainplayer domainplayer 目前離線
進階會員
 
註冊日期: 2002-05-31
文章: 4,757
發送 ICQ 消息給 domainplayer
預設 請教程式語言 (PHP) 達人

請教一下各位,
我發現我架的那支二手市場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個字元後才省略成"..."
或是有沒有其它辦法能解決這個問題?

希望懂的人能幫忙, 拜託拜託!
__________________
1515
回覆時引用此篇文章
  #2  
舊 2005-10-04, 10:49 PM
ras0314 ras0314 目前離線
進階會員
 
註冊日期: 2005-08-22
文章: 2,327
預設

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

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

回覆時引用此篇文章
  #3  
舊 2005-10-04, 10:51 PM
domainplayer domainplayer 目前離線
進階會員
 
註冊日期: 2002-05-31
文章: 4,757
發送 ICQ 消息給 domainplayer
預設

引用:
作者: ras0314
if(strlen($title)>15) $title=substr($title,0,15)."...";

會不會只要把15改大就好了阿??
改大了之後還是會有相同問題,
例如把15改成16後,
輸入"A一二三四五六七八"(17字元)
由於"八"變成由第16與17字元所組成,
在首頁顯示時還是會變成"A一二三四五六七?..."
__________________
1515
回覆時引用此篇文章
  #4  
舊 2005-10-04, 11:00 PM
ras0314 ras0314 目前離線
進階會員
 
註冊日期: 2005-08-22
文章: 2,327
預設

那把15改成50不就可以輸入25個中文字了嗎 ^^
__________________

回覆時引用此篇文章
  #5  
舊 2005-10-04, 11:24 PM
domainplayer domainplayer 目前離線
進階會員
 
註冊日期: 2002-05-31
文章: 4,757
發送 ICQ 消息給 domainplayer
預設

引用:
作者: ras0314
那把15改成50不就可以輸入25個中文字了嗎 ^^
二十五個字就超過我的版面設定了....
__________________
1515
回覆時引用此篇文章
  #6  
舊 2005-10-04, 11:53 PM
game.tw game.tw 目前離線
進階會員
 
註冊日期: 2002-10-01
文章: 1,370
預設

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

PHP應該有函數可以判斷字串中,某一位置的ASC II碼吧...
若無法直接判斷...
那就用一個 "變數 = 第15碼"
再用 ASC II的函數,來判斷他在ASC II中的編碼
應該就可以了
__________________
Gamer.info
回覆時引用此篇文章
  #7  
舊 2005-10-05, 12:56 AM
wmh wmh 目前離線
進階會員
 
註冊日期: 2004-08-27
文章: 310
預設

中文字第一碼和第二碼的 ASCII 都有可能超過 128,無法直接判斷出某字元是否屬於中文的第一碼。要判斷的話可試試由字串前頭開始一個個字元去判斷,遇到 ASCII 大於 128 則視為中文字的第一碼,則下一個字元視為中文字第二碼,依此方式繼續判斷下去,則可知道第 15 個字元是否為中文字第一碼。除非字串中用到特殊字元,否則通常結果會是正確的。
回覆時引用此篇文章
  #8  
舊 2005-10-05, 01:42 AM
ckmarkhsu ckmarkhsu 目前離線
論壇管理員
 
註冊日期: 2004-01-30
文章: 533
預設

dp老大你那支程式是什麼編碼

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

這是中文典型的問題...
回覆時引用此篇文章
  #9  
舊 2005-10-05, 08:29 AM
virileman virileman 目前離線
初級會員
 
註冊日期: 2005-08-26
文章: 18
預設

小弟喜歡使用 萬國碼 utf-8 ,字元數都統一 ,然後用 mb_substr() 此 funtion 來切割字串即不會有上述問題
回覆時引用此篇文章
  #10  
舊 2005-10-05, 07:03 PM
ckmarkhsu ckmarkhsu 目前離線
論壇管理員
 
註冊日期: 2004-01-30
文章: 533
預設

mb_substr好像要mbstring.dll這個模組才能支援...
回覆時引用此篇文章
回覆


發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼



所有時間均為 +8。現在的時間是 03:56 AM


本站主機由網易虛擬主機代管
Powered by vBulletin® 版本 3.8.4
版權所有 ©2000 - 2024,Jelsoft Enterprises Ltd.