如何利用PHP來擷取一段中文字串而不出現亂碼

2021-04-13 00:06:53 字數 1477 閱讀 9040

[code:1:e818e36f81]

/* 功能:擷取全形和半形混合的字串以避免亂碼

引數:

$str_cut 需要截斷的字串

$length  允許字串顯示的最大長度

*/ function substr_cut($str_cut,$length = 30)

return $str_cut;

} [/code:1:e818e36f81]

說明:

程式的關鍵語句是:

[code:1:e818e36f81]

for($i=0; $i < $length; $i++)

if (ord($str_cut[$i]) > 128) $i++;

$str_cut = substr($str_cut,0,$i) . "...";

[/code:1:e818e36f81]

如果字元的ascii碼大於128,說明當前字元和下乙個字元是屬於乙個漢字的。

則,$i++ 跳過對下乙個字元的判斷。

再結合迴圈中的 $i++ ,實際上,當遇到乙個漢字時,$i 就會加 2 ,從而正確的跳過漢字。

最終實現的效果是,$i 變數指向的要麼是半形的字元,要麼是全形漢字的首字元,不會指向

全形漢字的第二個字元,所以,當$i >= $length 時,迴圈結束,使用

$str_cut = substr($str_cut,0,$i) . "..."; 擷取字元時自然也就不會出現亂碼了。

本人在寫乙個程式時需要利用php從一段字串中擷取指定長度的一段字元下來。以前在寫asp的時候,參考動網的程式寫過類似的程式,不過,還沒用php寫過。

想偷懶,看有不有現成的**可以用。於是,在google中輸入:php 截斷字元 後查詢到一段**。

引用:

如何分別全形和半形以避免亂碼? 

我們可以寫這樣乙個函式來實現: 

[code:1:e818e36f81]

function chgtitle($title) 

return $title; 

}  

[/code:1:e818e36f81]

這個函式原理就是截斷乙個字元,看看其ascii碼是不是大於128,如果是,說明截斷的是乙個全形漢字,那麼就退後乙個截斷。用$length控制長度 

備註:迴圈判斷字串裡面的 >128 的字元個數,如果半形字元為偶數,則表示位置剛好為整個漢字,如果為奇數,則為半個漢字,需要取下乙個字元

消化、測試這段**後發現有問題。經過反覆除錯,查詢出,這段**基於的原理不正確。

它認為,漢字的兩個位元組其ascii碼都會大於128,其實不然,乙個漢字的首個位元組的ascii碼

必定是大於128的,但是第二個位元組的ascii碼不一定大於128,例如:"祐",其兩個位元組的ascii

碼分別為:181 和 118。

經過仔細分析,最終,我利用上面的函式實現了對全形和半形字串的擷取。 

php 如何擷取中文字串

在 應用中時常需要對相應的字串進行擷取。最常用的是使用substr函式對字串進行擷取。然而,substr和strlen函式只在處理英文本串時可以正確使用,在擷取中文字元時,時常出現亂碼。這時,可以使用mb substr和mb strlen函式。後者與前者用法相似,區別在於後者需要在使用過程中新增乙個...

Shell擷取文字一段區間的方法

假設檔案 text.txt 內容如下 xx yyyyyyyyyyyyyyyy zzzzzzzzzzzzzzzzzzz start mark 10 aaaaa bbbb cccc 20 aaaaa bbbb cccc 30 aaaaa bbbb cccc 40 aaaaa bbbb cccc yyyy...

Shell擷取文字一段區間的方法

假設有一段日誌,我需要擷取2019 09 23到2019 09 29之間期間的日誌。那麼,我利用shell怎麼去擷取呢 實現方法 sed n 2019 09 23 2019 09 29 p log.txt sed n a bp file這個就是擷取a和b之間的字元,包括a和b為什麼在a前面加上乙個 ...