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

PHP mb_strlen 處理中英混合字符串長度與截取完整指南

     編輯:PHP 相關知識

前置條件:啟用 mbstring 擴展

; php.ini
extension=mbstring

; Windows 需將 php_mbstring.dll 複製到系統目錄或 PHP 目錄

驗證:php -m | grep mbstring 或 phpinfo() 查看。

mb_strlen 編碼參數影響

<?php
$var = '中文字符abc';

echo mb_strlen($var, 'UTF-8'); // 7 個字符 (中英各算 1)
echo mb_strlen($var);          // 15 字節 (UTF-8 中文 3 字節,英文 1 字節)
echo mb_strlen($var, 'GBK');   // 9 (GBK 中文 2 字節,可能不準確)
?>

核心函數:多編碼安全截取

UTF-8 專用截取 (無需 mbstring)

function utf8Substr($str, $start, $length) {
    // 正則匹配 UTF-8 字符邊界
    return preg_replace(
        '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $start . '}' .
        '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,' . $length . '}).*#s',
        '$1', $str
    );
}

GBK/GB2312 截取

function gb2312Strlen($string) {
    $len = strlen($string);
    $count = 0;
    for ($i = 0; $i < $len; $i++) {
        $ord = ord($string[$i]);
        if ($ord < 127) { // ASCII
            $count++;
        } elseif ($ord >= 128) { // 雙字節字符
            $count++;
            $i++; // 跳過低位字節
        }
    }
    return $count;
}

function gb2312Substr($str, $start, $length) {
    $result = '';
    $count = 0;
    $len = strlen($str);
    for ($i = 0; $i < $len && $count < $start + $length; $i++) {
        $ord = ord($str[$i]);
        if ($count >= $start) $result .= $str[$i];
        if ($ord >= 128) { $result .= $str[++$i]; }
        $count++;
    }
    return $result;
}

現代最佳實踐:mb_substr + mb_strlen

<?php
// 統一設置內部編碼
mb_internal_encoding('UTF-8');

$str = '你好世界 Hello World';

// 獲取字符數
$len = mb_strlen($str); // 13

// 安全截取
$substr = mb_substr($str, 0, 10); // "你好世界 He"

// 截取並添加省略號
function mbTruncate($str, $length, $suffix = '...') {
    if (mb_strlen($str) <= $length) return $str;
    return mb_substr($str, 0, $length) . $suffix;
}

echo mbTruncate($str, 8); // "你好世界..."
?>

常見問題排查

現象原因解決
Call to undefined function mb_strlen未啟用 mbstringphp.ini 啟用 extension=mbstring
截取結果亂碼編碼參數錯誤指定正確編碼 mb_substr($str,0,10,'UTF-8')
長度計算不準內部編碼未設定mb_internal_encoding('UTF-8')

總結建議

  1. 專案統一使用 UTF-8
  2. 入口文件設置 mb_internal_encoding('UTF-8')
  3. 所有字符串長度/截取操作使用 mb_strlen/mb_substr
  4. 資料庫連接設置 SET NAMES utf8mb4
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved