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

PHP UTF-8 中文安全截取函數:cutstr 完整實作與原理解析

     編輯:PHP 相關知識

函數簽名

function cutstr($string, $length, $dot = '...')

$length 為字元寬度(中文算 2,英文數字算 1),超出則截斷並附加 $dot。

核心邏輯流程

  1. 快速判斷:若位元組長度 ≤ $length 直接返回。
  2. 保護 HTML 實體:將 &、"、<、> 替換為控制字元 chr(1) 包裹,防止截斷導致實體殘缺。
  3. UTF-8 字元寬度計算:依首位元組範圍判斷字元位元組數與顯示寬度:
    首位元組位元組數顯示寬度
    0x09,0x0A,0x20-0x7E11
    0xC2-0xDF22
    0xE0-0xEF32
    0xF0-0xF742
    0xF8-0xFB52
    0xFC-0xFD62
  4. 截斷位置修正:若累計寬度超標,回退上一字元位元組數。
  5. 還原 HTML 實體,移除殘留控制字元,附加尾綴。

非 UTF-8 環境 fallback

採用簡單雙位元組判斷(ord > 127 視為雙位元組字元),逐字元疊加至長度。

使用範例

$str = "你好世界 Hello World";
echo cutstr($str, 10); // 你好世界...
echo cutstr($str, 10, '[...]'); // 你好世界[...]

現代替代方案(PHP 5.4+)

// 使用 mbstring(需擴展)
function cutstr_mb($string, $length, $dot = '...') {
    if (mb_strwidth($string) <= $length) return $string;
    return mb_strimwidth($string, 0, $length, $dot, 'UTF-8');
}

// 使用 grapheme(PHP 7.0+,支援 Emoji 等字素叢集)
function cutstr_grapheme($string, $length, $dot = '...') {
    $clusters = grapheme_str_split($string);
    $width = 0; $result = '';
    foreach ($clusters as $g) {
        $w = (preg_match('/^[\x00-\x7F]$/', $g) ? 1 : 2);
        if ($width + $w > $length) break;
        $result .= $g; $width += $w;
    }
    return $result . ($width < mb_strwidth($string) ? $dot : '');
}

建議:生產環境優先使用 mb_strimwidth 或 grapheme_*,相容性更佳、效能更高、支援完整 Unicode。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved