- 論壇徽章:
- 0
|
標(biāo)題:如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼
作者:jeffwu(jeffwu_cn@hotmail.com)
- /*
- 功能:截取全角和半角混合的字符串以避免亂碼
- 參數(shù):
- $str_cut 需要截?cái)嗟淖址?br />
- $length 允許字符串顯示的最大長(zhǎng)度
- */
- function substr_cut($str_cut,$length = 30){
- if (strlen($str_cut) >; $length){
- for($i=0; $i < $length; $i++)
- if (ord($str_cut[$i]) >; 128) $i++;
- $str_cut = substr($str_cut,0,$i) . "...";
- }
- return $str_cut;
- }
復(fù)制代碼
說(shuō)明:
程序的關(guān)鍵語(yǔ)句是:
- for($i=0; $i < $length; $i++)
- if (ord($str_cut[$i]) >; 128) $i++;
-
- $str_cut = substr($str_cut,0,$i) . "...";
復(fù)制代碼
如果字符的ASCII碼大于128,說(shuō)明當(dāng)前字符和下一個(gè)字符是屬于一個(gè)漢字的。
則,$i++ 跳過(guò)對(duì)下一個(gè)字符的判斷。
再結(jié)合循環(huán)中的 $i++ ,實(shí)際上,當(dāng)遇到一個(gè)漢字時(shí),$i 就會(huì)加 2 ,從而正確的跳過(guò)漢字。
最終實(shí)現(xiàn)的效果是,$i 變量指向的要么是半角的字符,要么是全角漢字的首字符,不會(huì)指向
全角漢字的第二個(gè)字符,所以,當(dāng)$i >;= $length 時(shí),循環(huán)結(jié)束,使用
$str_cut = substr($str_cut,0,$i) . "..."; 截取字符時(shí)自然也就不會(huì)出現(xiàn)亂碼了。
本人在寫(xiě)一個(gè)程序時(shí)需要利用PHP從一段字符串中截取指定長(zhǎng)度的一段字符下來(lái)。以前在寫(xiě)ASP的時(shí)候,參考動(dòng)網(wǎng)的程序?qū)戇^(guò)類(lèi)似的程序,不過(guò),還沒(méi)用PHP寫(xiě)過(guò)。
想偷懶,看有不有現(xiàn)成的代碼可以用。于是,在GOOGLE中輸入:PHP 截?cái)嘧址?后查找到一段代碼。
全文:http://www.yesky.com/SoftChannel ... 510/1610570_3.shtml
引用:
#########################################################################
如何分別全角和半角以避免亂碼?
我們可以寫(xiě)這樣一個(gè)函數(shù)來(lái)實(shí)現(xiàn):
- function ChgTitle($title)
- {
- $length = 46; //我們?cè)试S字符串顯示的最大長(zhǎng)度
- if (strlen($title)>$length) {
- $temp = 0;
- for($i=0; $i<$length; $i++)
- if (ord($title[$i]) > 128) $temp++;
- if ($temp%2 == 0)
- $title = substr($title,0,$length)."...";
- else
- $title = substr($title,0,$length+1)."...";
- }
- return $title;
- }
復(fù)制代碼
這個(gè)函數(shù)原理就是截?cái)嘁粋(gè)字符,看看其ascII碼是不是大于128,如果是,說(shuō)明截?cái)嗟氖且粋(gè)全角漢字,那么就退后一個(gè)截?cái)。?length控制長(zhǎng)度
備注:循環(huán)判斷字符串里面的 >128 的字符個(gè)數(shù),如果半角字符為偶數(shù),則表示位置剛好為整個(gè)漢字,如果為奇數(shù),則為半個(gè)漢字,需要取下一個(gè)字符
#######################################################################
消化、測(cè)試這段代碼后發(fā)現(xiàn)有問(wèn)題。經(jīng)過(guò)反復(fù)調(diào)試,查找出,這段代碼基于的原理不正確。
它認(rèn)為,漢字的兩個(gè)字節(jié)其ASCII碼都會(huì)大于128,其實(shí)不然,一個(gè)漢字的首個(gè)字節(jié)的ASCII碼
必定是大于128的,但是第二個(gè)字節(jié)的ASCII碼不一定大于128,例如:"祐",其兩個(gè)字節(jié)的ASCII
碼分別為:181 和 118。
經(jīng)過(guò)仔細(xì)分析,最終,我利用上面的函數(shù)實(shí)現(xiàn)了對(duì)全角和半角字符串的截取。
一點(diǎn)點(diǎn)體會(huì),寫(xiě)出來(lái)也是想和大家一起交流、學(xué)習(xí)。我不知道是不是有人已經(jīng)寫(xiě)過(guò)上面的函數(shù),不過(guò),
我還沒(méi)能讀到,也就只能自己琢磨了,呵呵。
歡迎有興趣的朋友來(lái)信交流。
[ 本帖最后由 jeffwu 于 2008-2-18 17:57 編輯 ] |
|