亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 6100 | 回復(fù): 10
打印 上一主題 下一主題

如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2003-11-25 14:34 |只看該作者 |倒序?yàn)g覽
標(biāo)題:如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼

作者:jeffwu(jeffwu_cn@hotmail.com)

  1. /*
  2. 功能:截取全角和半角混合的字符串以避免亂碼
  3. 參數(shù):
  4.         $str_cut        需要截?cái)嗟淖址?br />
  5.         $length  允許字符串顯示的最大長(zhǎng)度

  6. */

  7. function substr_cut($str_cut,$length = 30){

  8.         if (strlen($str_cut) >; $length){
  9.   for($i=0; $i < $length; $i++)
  10.           if (ord($str_cut[$i]) >; 128)        $i++;
  11.   $str_cut = substr($str_cut,0,$i) . "...";
  12.         }
  13.         return $str_cut;
  14. }

復(fù)制代碼

說(shuō)明:
        程序的關(guān)鍵語(yǔ)句是:

  1.         for($i=0; $i < $length; $i++)
  2.                 if (ord($str_cut[$i]) >; 128)        $i++;
  3.        
  4.         $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):

  1. function ChgTitle($title)
  2. {
  3. $length = 46; //我們?cè)试S字符串顯示的最大長(zhǎng)度
  4. if (strlen($title)>$length) {
  5. $temp = 0;
  6. for($i=0; $i<$length; $i++)
  7. if (ord($title[$i]) > 128) $temp++;
  8. if ($temp%2 == 0)
  9. $title = substr($title,0,$length)."...";
  10. else
  11. $title = substr($title,0,$length+1)."...";
  12. }
  13. return $title;
  14. }  
復(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 編輯 ]
longnetpro 該用戶(hù)已被刪除
2 [報(bào)告]
發(fā)表于 2003-11-26 02:26 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2003-11-26 09:01 |只看該作者

如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼

哈哈..樓主例只,只能用于GB2312,如果是GB18030,GBK不知可以嗎????

原帖由 "longnetpro"]E\x80-\xFE 發(fā)表:
){30}/

我用的方法一貫是:將多字節(jié)碼(如中文)轉(zhuǎn)換為UNICODE,長(zhǎng)度自然就出來(lái)了。不過(guò)一般只針對(duì)長(zhǎng)度比較短的字符串,因?yàn)樵谝话愕腜HP編程中很少需要分析長(zhǎng)的多字節(jié)編碼的字符串(如求長(zhǎng)度或是截取?.........


我的整個(gè)站點(diǎn)都是UTF-8的..?dāng)?shù)據(jù)庫(kù)使用UNICODE 數(shù)據(jù)存儲(chǔ)UTF-8

member=>; select substring('數(shù)據(jù)庫(kù)的編碼是用系統(tǒng)表' from 1 for 4);

substring

-----------

數(shù)據(jù)庫(kù)的

(1 row)



member=>; select substring('數(shù)據(jù)庫(kù)的編碼是用系統(tǒng)表' from 1 for 2);

substring

-----------

數(shù)據(jù)

(1 row)



member=>; select * from 組;

序號(hào) |     組名     |         描述

------+--------------+----------------------

    1 | 域用戶(hù)       | 9812.net域內(nèi)用戶(hù)

    3 | 計(jì)算機(jī)維護(hù)組 | 維護(hù)計(jì)算機(jī)的用戶(hù)用戶(hù)

(2 rows)



member=>; select 組名,substring(描述 from 1 for 5) as 描述 from 組;

     組名     |    描述

--------------+------------

域用戶(hù)       | 9812.

計(jì)算機(jī)維護(hù)組 | 維護(hù)計(jì)算機(jī)

(2 rows)
longnetpro 該用戶(hù)已被刪除
4 [報(bào)告]
發(fā)表于 2003-11-26 11:20 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2003-11-26 17:06 |只看該作者

如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼

原帖由 "longnetpro" 發(fā)表:
你這個(gè)是對(duì)特殊設(shè)置的數(shù)據(jù)庫(kù)可行,比較通用的辦法還是用PHP即時(shí)轉(zhuǎn)換吧。

我前一個(gè)月寫(xiě)了一個(gè)漢字編碼轉(zhuǎn)換的程序,支持UTF8,UTF16BE、LE,UTF32BE、LE,GB18030,BIG5的互轉(zhuǎn),支持繁簡(jiǎn)互轉(zhuǎn),中間代碼用UNICODE。
..........


不支持UNICODE.的數(shù)據(jù)就是不合格產(chǎn)品..

你那么轉(zhuǎn)來(lái)轉(zhuǎn)去.煩不煩...影響性能...
如果要轉(zhuǎn)碼.使用iconv 函數(shù)就行了.編譯時(shí)加--with-iconv
數(shù)據(jù)本身也支持
select convert(描述,'UNICODE','GBK')as desc from 組;
select convert(組名 using utf_8_to_gb18030) from 組;

http://home.9812.net/linux/article/postgres/postgresql.htm

請(qǐng)看看..
11.8.2 PHP
longnetpro 該用戶(hù)已被刪除
6 [報(bào)告]
發(fā)表于 2003-11-26 20:35 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2003-11-27 09:08 |只看該作者

如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼

原帖由 "longnetpro" 發(fā)表:


不支持UNICODE的數(shù)據(jù)就是不合格產(chǎn)品?可能你這么認(rèn)為,可很多老外并不這么認(rèn)為的。其實(shí)說(shuō)白了,UNICODE還是為了照顧非拉丁文字語(yǔ)言而搞的,它為什么一定要支持?因?yàn)閁NICODE只是一個(gè)組織定的標(biāo)準(zhǔn),并不一定被所有..........


這是直接使用UNICODE與間接使用... 的問(wèn)題.

UNICODE還是為了照顧非拉丁文字語(yǔ)言而搞的..不是為了"照顧".
而是為了跨平臺(tái)兼容..

UNICODE 使你的數(shù)據(jù)庫(kù)可以存儲(chǔ),中文(繁,簡(jiǎn),蒙古,藏文....),日文,韓文.啊拉伯..等等.....
一個(gè)中文漢字長(zhǎng)=假名長(zhǎng)=韓文長(zhǎng)=啊拉伯字長(zhǎng)=英文.......
好處不用說(shuō)...

所以以后發(fā)表結(jié)論的時(shí)候請(qǐng)客觀一點(diǎn),看問(wèn)題的視角多一點(diǎn),不是只從自己出發(fā)。


你可以看看我寫(xiě)的文檔..
http://home.9812.net/linux/article/postgres/postgresql.htm

11.8       漢字編碼問(wèn)題


文中提供了.4轉(zhuǎn)碼方案.(包括原代碼) 視角還不夠多嗎? 目前還沒(méi)想出其它方案.
longnetpro 該用戶(hù)已被刪除
8 [報(bào)告]
發(fā)表于 2003-11-27 10:04 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2003-11-27 10:26 |只看該作者

如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼

我的方法同樣適合SQL99的數(shù)據(jù).如Oracle

一般不合格數(shù)據(jù)都是SQL92的.如果他不支持UNICODE.為什么拿到其它國(guó)家銷(xiāo)售呢..???哈哈...


MS Sqlserver , Sybase 雖然是SQL92但他加了很多自己東東.跟本不是ASNI 的SQL。病。樱眩蹋梗

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2003-11-28 10:19 |只看該作者

如何利用PHP來(lái)截取一段中文字符串而不出現(xiàn)亂碼

hehe,這段代碼最早是我在phpease.com發(fā)表的,來(lái)源于幾年前作的漢字顯示研究

往事不在,phpease.com也關(guān)門(mén), 當(dāng)年php紅火的場(chǎng)面也不在了,但欣慰的是用php 的人越來(lái)越多了

上面的邊界字符還有問(wèn)題,最好的是判斷

是否大于0xa0,這是漢字的第一個(gè)字符開(kāi)始的編碼
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP