首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 截取中英混合字串函數:支援 GBK/UTF-8

     編輯:PHP 相關知識

GBK 中文佔 2 位元組,UTF-8 中文佔 3 位元組,英文皆佔 1 位元組。直接用 substr() 會導致中文截斷產生亂碼。以下函數完美解決中英混合截取。

通用截取函數

function get_word($string, $length, $dot = '..', $charset = 'gbk') {
    if (strlen($string) <= $length) return $string;
    $string = str_replace(array(' ', ' ', '&', '"', '<', '>'), array('', '', '&', '"', '<', '>'), $string);
    $strcut = '';
    if (strtolower($charset) == 'utf-8') {
        $n = $tn = $noc = 0;
        while ($n < strlen($string)) {
            $t = ord($string[$n]);
            if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { $tn = 1; $n++; $noc++; }
            elseif (194 <= $t && $t <= 223) { $tn = 2; $n += 2; $noc += 2; }
            elseif (224 <= $t && $t < 239) { $tn = 3; $n += 3; $noc += 2; }
            elseif (240 <= $t && $t <= 247) { $tn = 4; $n += 4; $noc += 2; }
            elseif (248 <= $t && $t <= 251) { $tn = 5; $n += 5; $noc += 2; }
            elseif ($t == 252 || $t == 253) { $tn = 6; $n += 6; $noc += 2; }
            else { $n++; }
            if ($noc >= $length) break;
        }
        if ($noc > $length) $n -= $tn;
        $strcut = substr($string, 0, $n);
    } else {
        for ($i = 0; $i < $length; $i++) {
            $strcut .= ord($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i];
        }
    }
    return $strcut . $dot;
}

測試範例

$str = "歡迎 visit 簡明 bkjia";
$str_result = get_word($str, 12);
echo $str_result; // 輸出: 歡迎 visit..

關鍵點

  • UTF-8 模式下依位元組特徵值判斷字符寬度(1-6 位元組),累計顯示寬度(中文算 2)。
  • GBK 模式下遇高位元組(>127)直接取雙位元組。
  • 預先轉換 HTML 實體,避免截斷實體導致顯示異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved