《PHP教程:PHP中文字符串截?cái)酂o亂碼解決方法》要點(diǎn):
本文介紹了PHP教程:PHP中文字符串截?cái)酂o亂碼解決方法,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
PHP實(shí)例一個(gè)比較好用的字符串截取函數(shù):
PHP實(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;
}
PHP實(shí)例使用方法示例:
PHP實(shí)例
$str1 = '我是一串比較長(zhǎng)的中文不帶英文';
$str2 = '我是一串比較長(zhǎng)的中文帶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);
PHP實(shí)例結(jié)果顯示:
PHP實(shí)例28
29
我是一串比較
我是一串比較
中文不帶英文
中文帶yingwen
PHP實(shí)例這個(gè)函數(shù)十分有用,比如用來截?cái)啾容^長(zhǎng)的文件名,但是要在中間加上...,可以這樣來做:
PHP實(shí)例
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;
}
}
PHP實(shí)例另外,網(wǎng)上看到一種超級(jí)簡(jiǎn)單的中文截?cái)嘟鉀Q方案,試用了一下,效果也不錯(cuò):
PHP實(shí)例echo substr($str1,0,10).chr(0);
PHP實(shí)例原理解釋:
PHP實(shí)例chr(0)不是null
07null是什么都沒有,而chr(0)的值是0.表示成16進(jìn)制是0x00,表示成二進(jìn)制是00000000
08雖然chr(0)不會(huì)顯示出什么,但是他是一個(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)亂碼了
PHP實(shí)例----------------------------
PHP實(shí)例20120705更新:?
PHP實(shí)例以上方法雖好,但是偶爾還是會(huì)碰到亂碼,原因未深究.不過可以用以下的方法,對(duì)UTF8字符文本屢試不爽.
注意:該方法中將漢字計(jì)算為1單位長(zhǎng)度,英文一個(gè)字母1單位長(zhǎng)度,所以截?cái)鄷r(shí)需要注意長(zhǎng)度設(shè)置.
計(jì)算長(zhǎng)度的方法:
PHP實(shí)例
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;
PHP實(shí)例字符串截?cái)嗪瘮?shù):
PHP實(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;
PHP實(shí)例使用方法和之前介紹的一樣,比如formatName可以實(shí)現(xiàn)如下(這對(duì)漢字長(zhǎng)度做了小優(yōu)化):
PHP實(shí)例
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;
}
}
PHP實(shí)例以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持維易PHP.
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/3095.html