当前位置: 首页> 最新文章列表> 使用 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'>第{$i}页</a> ";
}

这个逻辑会生成指向不同页码的链接,每次点击都会通过 $_GET['page'] 获取对应的片段内容进行展示。


五、注意事项

  1. 编码一致性:确保字符串与 mb_strcut 使用的编码一致,否则仍可能出现字符乱码问题。

  2. 尾页处理:最后一页可能不足设定字节数,需要兼容处理。

  3. 缓存优化:如果文本内容不频繁变化,可以考虑对分页片段做缓存,提升性能。