最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP中文字符串截斷無亂碼解決方法

 更新時間:2016年10月10日 17:19:01   作者:令狐蔥  
這篇文章主要為大家詳細(xì)介紹了PHP獲取用戶客戶端真實IP的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一個比較好用的字符串截取函數(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

這個函數(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;
  }
}

另外,網(wǎng)上看到一種超級簡單的中文截斷解決方案,試用了一下,效果也不錯:

echo substr($str1,0,10).chr(0);

原理解釋:

chr(0)不是null
07null是什么都沒有,而chr(0)的值是0。表示成16進(jìn)制是0x00,表示成二進(jìn)制是00000000
08雖然chr(0)不會顯示出什么,但是他是一個字符。
09當(dāng)漢字被截斷時,根據(jù)編碼規(guī)則他總是要把后邊的其他字符拉過來一起作為漢字解釋,這就是出現(xiàn)亂碼的原因。而值為0x81到0xff與0x00組合始終都顯示為“空”
10根據(jù)這一特點,在substr的結(jié)果后面補(bǔ)上一個chr(0),就可以防止出現(xiàn)亂碼了

----------------------------

20120705更新: 

以上方法雖好,但是偶爾還是會碰到亂碼,原因未深究。不過可以用以下的方法,對UTF8字符文本屢試不爽。
注意:該方法中將漢字計算為1單位長度,英文一個字母1單位長度,所以截斷時需要注意長度設(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;

字符串截斷函數(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可以實現(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

百色市| 观塘区| 元朗区| 柳州市| 沙田区| 新乡县| 靖西县| 安顺市| 广宁县| 门源| 太仓市| 庆云县| 岱山县| 韶山市| 荣昌县| 神农架林区| 江川县| 木兰县| 高淳县| 南京市| 安新县| 屯留县| 芮城县| 德江县| 增城市| 锡林浩特市| 开原市| 裕民县| 芮城县| 武功县| 湘阴县| 深泽县| 云阳县| 兴城市| 双桥区| 南宫市| 玉溪市| 宜都市| 宁强县| 上栗县| 吐鲁番市|