You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twig字符串截断字符计数异常求助:特殊字符致长度计算错误

问题根源与解决方案

你的问题出在Twig默认的length过滤器是按字节数统计,而非视觉上的Unicode字符数。

比如你提到的撇号’是UTF-8编码的多字节字符(占3个字节),原本单个视觉字符会被length算成3个字节,这就导致统计出来的长度比实际视觉字符数多,触发了不该触发的截断逻辑。而你尝试的|raw、|striptags过滤器只是处理HTML转义或标签的,和字符长度的统计机制无关,所以解决不了这个问题。

解决办法

1. 使用Twig多字节过滤器(推荐)

如果你的环境中Twig启用了多字节支持(比如安装了Twig\Extra\Intl\IntlExtension扩展),直接用mb_length和mb_slice过滤器替换默认的length和slice:

{{ project.title|mb_length > 33 ? project.title|mb_slice(0, 33) ~ '…' : project.title }}

mb_length会按Unicode字符数统计长度,mb_slice也会按字符数截取,不会把多字节字符拆断。

2. 自定义字符计数与截取过滤器

如果没有多字节扩展,自己写个Twig过滤器,用PHP的mb_strlen和mb_substr实现正确的字符统计:

// 以Symfony环境为例,在Twig配置中注册过滤器
$twig->addFilter(new TwigFilter('char_length', function ($string) {
    return mb_strlen($string, 'UTF-8');
}));

$twig->addFilter(new TwigFilter('char_slice', function ($string, $start, $length) {
    return mb_substr($string, $start, $length, 'UTF-8');
}));

之后在Twig模板里用自定义过滤器:

{{ project.title|char_length > 33 ? project.title|char_slice(0, 33) ~ '…' : project.title }}

额外注意

如果你的字符串里包含HTML实体(比如示例里的"),要先转成实际字符再统计,不然实体会被当成多个字节。这种情况可以先加|raw过滤器,但要确保字符串是安全的(不存在XSS风险):

{{ project.title|raw|mb_length > 33 ? project.title|raw|mb_slice(0, 33) ~ '…' : project.title }}

内容的提问来源于stack exchange,提问作者Jandon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:31:02