當前位置: 首頁> 最新文章列表> 使用mb_strcut 實現中文字符的精準截取與分頁展示

使用mb_strcut 實現中文字符的精準截取與分頁展示

gitbox 2025-05-29

一、為什麼選擇mb_strcut 而不是substr 或mb_substr?

在PHP 中, substr會按照字節長度截取字符串,但中文字符(如UTF-8 編碼下)通常佔用多個字節,這就可能導致一個漢字被從中間截斷,進而出現亂碼。雖然mb_substr能按字符長度截取,但當我們按“字節數”分頁顯示時(如限制輸出在一定字節數內),就需要使用mb_strcut

mb_strcut的優勢在於:

  • 按“字節數”截取,但不會截斷字符;

  • 保證多字節字符的完整性;

  • 適用於所有多字節編碼格式(如UTF-8、GB2312 等)。


二、mb_strcut 函數的基本用法

mb_strcut(string $string, int $start, ?int $length = null, ?string $encoding = null): string
  • $string : 要處理的原始字符串。

  • $start : 起始字節偏移量(從0開始)。

  • $length : 要截取的最大字節數。

  • $encoding : 字符串編碼,通常設置為"UTF-8"。

示例:

 $text = "這是一個用於測試的中文字符串";
$cut = mb_strcut($text, 0, 12, 'UTF-8');
echo $cut;

輸出:這是一個用(因為每個中文字符在UTF-8 中佔用3 個字節,12 字節截取的是前4 個漢字)。


三、結合分頁邏輯使用mb_strcut 展示內容

1. 獲取分頁片段

假設我們希望每頁顯示不超過60 個字節的中文內容,可以寫一個分頁函數如下:

 function getPageContent(string $content, int $page = 1, int $bytesPerPage = 60): string {
    $start = ($page - 1) * $bytesPerPage;
    return mb_strcut($content, $start, $bytesPerPage, 'UTF-8');
}

2. 示例使用:

 $content = file_get_contents('https://gitbox.net/content.txt');
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;

$display = getPageContent($content, $page);
echo "<div>$display</div>";

在這個例子中,程序會根據當前頁碼輸出不超過60 字節的中文內容,並自動處理字符完整性。


四、分頁鏈接的實現

為了實現用戶點擊分頁鏈接瀏覽下一頁內容,可以在頁面底部生成簡單的分頁鏈接:

 $totalBytes = strlen($content);
$totalPages = ceil($totalBytes / 60);

for ($i = 1; $i <= $totalPages; $i++) {
    echo "<a href='https://gitbox.net/pagination.php?page=$i'>1。{$i}頁</a> ";
}

這個邏輯會生成指向不同頁碼的鏈接,每次點擊都會通過$_GET['page']獲取對應的片段內容進行展示。


五、注意事項

  1. 編碼一致性:確保字符串與mb_strcut使用的編碼一致,否則仍可能出現字符亂碼問題。

  2. 尾頁處理:最後一頁可能不足設定字節數,需要兼容處理。

  3. 緩存優化:如果文本內容不頻繁變化,可以考慮對分頁片段做緩存,提升性能。