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

PHP 多編碼中文字串截取方案:GB2312、UTF-8 與通用函數

     編輯:PHP 相關知識

中英文混排字串截取的編碼挑戰與解決方案

PHP 內建 substr() 按位元組截取,對多位元組編碼(GBK/UTF-8)會導致中文斷碼、亂碼。需依編碼特性實作字元級截取。

GB2312/GBK 雙位元組編碼截取

 0xA0) { // 中文區間
            if ($charCount >= $start) {
                $result .= $str[$i] . $str[$i+1];
            }
            $i++; // 跳過第二位元組
            $charCount++;
        } else { // ASCII
            if ($charCount >= $start) {
                $result .= $str[$i];
            }
            $charCount++;
        }
    }
    return $result;
}
?>

UTF-8 多位元組編碼截取(正則法)

通用雙編碼支援函數

 $sublen) {
            return implode('', array_slice($chars, $start, $sublen)) . '...';
        }
        return implode('', array_slice($chars, $start, $sublen));
    } else { // GB2312/GBK
        $start *= 2; $sublen *= 2; // 近似位元組位移
        $strlen = strlen($string);
        $result = '';
        for ($i = 0; $i < $strlen; $i++) {
            if ($i >= $start && $i < $start + $sublen) {
                $ord = ord($string[$i]);
                if ($ord > 129) { // 中文首位元組
                    $result .= $string[$i] . $string[$i+1];
                    $i++;
                } else {
                    $result .= $string[$i];
                }
            }
            if (ord($string[$i]) > 129) $i++;
        }
        return strlen($result) < $strlen ? $result . '...' : $result;
    }
}

// 使用範例
$str = "abcd需要截取的字符串";
echo cutStr($str, 8, 0, 'GB2312'); // 輸出:abcd需要截取
?>

BugFree 專案實戰版本

= 224) { // 3 位元組 UTF-8
            $result .= substr($string, $i, 3);
            $i += 3;
        } elseif ($ord >= 192) { // 2 位元組 UTF-8
            $result .= substr($string, $i, 2);
            $i += 2;
        } else { // ASCII
            $result .= $char;
            $i++;
        }
    }
    return $append ? $result . '...' : $result;
}
?>

現代最佳實踐:mbstring 擴展

建議:生產環境優先使用 mb_substr()、mb_strimwidth(),僅在無法安裝擴展時使用自製函數。

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