PHP中文字符串截?cái)酂o亂碼解決方法
一個(gè)比較好用的字符串截取函數(shù):
function substring($str, $start, $length){ //比較好用字符串截取函數(shù) $len = $length; if($length < 0){ $str = strrev($str); $len = -$length; } $len= ($len < strlen($str)) ? $len : strlen($str); $tmpstr = ""; for ($i= $start; $i < $len; $i ++) { if (ord(substr($str, $i, 1)) > 0xa0) { $tmpstr .= substr($str, $i, 2); $i++; } else { $tmpstr .= substr($str, $i, 1); } } if($length < 0) $tmpstr = strrev($tmpstr); return $tmpstr; }
使用方法示例:
$str1 = '我是一串比較長的中文不帶英文'; $str2 = '我是一串比較長的中文帶yingwen'; $len = strlen($str1); echo '<br />'.$len; //return 28 $len = strlen($str2); echo '<br />'.$len; //return 29 echo '<br />'; echo substring($str1, 0, 11); echo '<br />'; echo substring($str2, 0, 11); echo '<br />'; echo substring($str1, 16, 28); echo '<br />'; echo substring($str2, 16, 29);
結(jié)果顯示:
28
29
我是一串比較
我是一串比較
中文不帶英文
中文帶yingwen
這個(gè)函數(shù)十分有用,比如用來截?cái)啾容^長的文件名,但是要在中間加上...,可以這樣來做:
function formatName($str, $size){ $len = strlen($str); if(strlen($str) > $size) { $part1 = substring($str, 0, $size / 2); $part2 = substring($str, $len - ($size/2), $len); return $part1 . "..." . $part2; } else { return $str; } }
另外,網(wǎng)上看到一種超級簡單的中文截?cái)嘟鉀Q方案,試用了一下,效果也不錯:
echo substr($str1,0,10).chr(0);
原理解釋:
chr(0)不是null
07null是什么都沒有,而chr(0)的值是0。表示成16進(jìn)制是0x00,表示成二進(jìn)制是00000000
08雖然chr(0)不會顯示出什么,但是他是一個(gè)字符。
09當(dāng)漢字被截?cái)鄷r(shí),根據(jù)編碼規(guī)則他總是要把后邊的其他字符拉過來一起作為漢字解釋,這就是出現(xiàn)亂碼的原因。而值為0x81到0xff與0x00組合始終都顯示為“空”
10根據(jù)這一特點(diǎn),在substr的結(jié)果后面補(bǔ)上一個(gè)chr(0),就可以防止出現(xiàn)亂碼了
----------------------------
20120705更新:
以上方法雖好,但是偶爾還是會碰到亂碼,原因未深究。不過可以用以下的方法,對UTF8字符文本屢試不爽。
注意:該方法中將漢字計(jì)算為1單位長度,英文一個(gè)字母1單位長度,所以截?cái)鄷r(shí)需要注意長度設(shè)置。
計(jì)算長度的方法:
function strlen_UTF8($str) { $len = strlen($str); $n = 0; for($i = 0; $i < $len; $i++) { $x = substr($str, $i, 1); $a = base_convert(ord($x), 10, 2); $a = substr('00000000'.$a, -8); if (substr($a, 0, 1) == 0) { }elseif (substr($a, 0, 3) == 110) { $i += 1; }elseif (substr($a, 0, 4) == 1110) { $i += 2; } $n++; } return $n; } // End strlen_UTF8;
字符串截?cái)嗪瘮?shù):
function subString_UTF8($str, $start, $lenth) { $len = strlen($str); $r = array(); $n = 0; $m = 0; for($i = 0; $i < $len; $i++) { $x = substr($str, $i, 1); $a = base_convert(ord($x), 10, 2); $a = substr('00000000'.$a, -8); if ($n < $start){ if (substr($a, 0, 1) == 0) { }elseif (substr($a, 0, 3) == 110) { $i += 1; }elseif (substr($a, 0, 4) == 1110) { $i += 2; } $n++; }else{ if (substr($a, 0, 1) == 0) { $r[ ] = substr($str, $i, 1); }elseif (substr($a, 0, 3) == 110) { $r[ ] = substr($str, $i, 2); $i += 1; }elseif (substr($a, 0, 4) == 1110) { $r[ ] = substr($str, $i, 3); $i += 2; }else{ $r[ ] = ''; } if (++$m >= $lenth){ break; } } } return join($r); } // End subString_UTF8;
使用方法和之前介紹的一樣,比如formatName可以實(shí)現(xiàn)如下(這對漢字長度做了小優(yōu)化):
function formatName($str, $size){ $len = strlen_UTF8($str); $one_len = strlen($str); $size = $size * 1.5 * $len / ($one_len); if(strlen_UTF8($str) > $size) { $part1 = subString_UTF8($str, 0, $size / 2); $part2 = subString_UTF8($str, $len - ($size/2), $len); return $part1 . "..." . $part2; } else { return $str; } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- PHP反轉(zhuǎn)字符串函數(shù)strrev()函數(shù)的用法
- PHP讀MYSQL中文亂碼的快速解決方法
- php版微信公眾平臺回復(fù)中文出現(xiàn)亂碼問題的解決方法
- php pdo oracle中文亂碼的快速解決方法
- PHP附件下載中文名稱亂碼的解決方法
- php生成二維碼時(shí)出現(xiàn)中文亂碼的解決方法
- PHP中使用file_get_contents抓取網(wǎng)頁中文亂碼問題解決方法
- php中json_encode UTF-8中文亂碼的更好解決方法
- php中json_encode處理gbk與gb2312中文亂碼問題的解決方法
- php網(wǎng)頁標(biāo)題中文亂碼的有效解決方法
- php上傳文件中文文件名亂碼的解決方法
- PHP使用strrev翻轉(zhuǎn)中文亂碼問題的解決方法
相關(guān)文章
php中通過虛代理實(shí)現(xiàn)延遲加載的實(shí)現(xiàn)代碼
基本原理是通過一個(gè)虛代理(Virtual Proxy)做占位符,一旦訪問代理對象的某成員(方法或?qū)傩裕?,加載就被觸發(fā)。2011-06-06Ubuntu中搭建Nginx、PHP環(huán)境最簡單的方法
這篇文章主要介紹了Ubuntu中搭建Nginx、PHP環(huán)境最簡單的方法,本文講解的是使用apt-get工具安裝Nginx、PHP環(huán)境,并講解了基本配置,需要的朋友可以參考下2015-03-03php中switch與ifelse的效率區(qū)別及適用情況分析
這篇文章主要介紹了php中switch與ifelse的效率區(qū)別及適用情況分析,以實(shí)例的形式分析了針對變量與常量的情況下switch與ifelse的效率區(qū)別,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02實(shí)現(xiàn)在同一方法中獲取當(dāng)前方法中新賦值的session值解決方法
這篇文章主要介紹了在同一方法中獲取當(dāng)前方法中新賦值的session值解決方法,需要的朋友可以參考下2014-06-06PHP 內(nèi)存緩存加速功能memcached安裝與用法
memcached 簡介在很多場合,我們都會聽到 memcached 這個(gè)名字,但很多同學(xué)只是聽過,并沒有用過或?qū)嶋H了解過,只知道它是一個(gè)很不錯的東東。這里簡單介紹一下。2009-09-09Laravel實(shí)現(xiàn)批量更新多條數(shù)據(jù)
這篇文章主要介紹了Laravel實(shí)現(xiàn)批量更新多條數(shù)據(jù),需要的朋友可以參考下2020-04-04