推荐使用 mb_substr 而非 iconv_substr:前者是专为多字节编码设计的核心函数,按字符截取、容错性强、PHP 7.4 稳定可用;后者依赖系统 iconv、按字节截取易乱码、PHP 8.0 已废弃。

iconv_substr 和 mb_substr 都是用来截取多字节字符串的函数,但在设计目标、编码处理逻辑、错误容错性和维护状态上存在关键差异,尤其在 PHP 7.4 这个已进入安全维护期(EOL)的版本中更需注意。
mb_substr 是推荐使用的多字节子串函数
它是 PHP 的多字节字符串扩展(mbstring)核心函数,专为 Unicode/UTF-8 等多字节编码设计。
- 默认按字符(而非字节)截取,自动识别 UTF-8、GBK、BIG5 等编码边界
- 支持显式指定
$encoding参数,不传时使用mb_internal_encoding()当前设置 - 对非法字节序列有较好容错,比如截断中间的 UTF-8 多字节字符时会跳过或补空,不易崩溃
- 在 PHP 7.4 中稳定可用,且是现代 PHP 应用的事实标准
iconv_substr 是 iconv 扩展提供的替代方案,功能较局限
它本质是 iconv 库的封装,依赖系统级 iconv 实现,行为更底层也更脆弱:
- 必须显式传入
$in_charset和$out_charset,即使输入输出编码相同也要写两遍 - 按字节位置计算偏移,不感知字符边界;若在 UTF-8 字符中间截断,可能产生乱码甚至解析失败
- 遇到非法编码字节时容易返回
false或触发警告,可靠性低于mb_substr - 自 PHP 8.0 起已被标记为“废弃(deprecated)”,PHP 7.4 虽仍可用,但不建议新代码使用
实际使用建议
- 统一启用并配置
mbstring扩展,设好mb_internal_encoding('UTF-8') - 截取字符串优先写
mb_substr($str, $start, $length, 'UTF-8') - 不要依赖
iconv_substr做核心业务逻辑,仅在极少数需要与旧 iconv 工具链对齐时临时使用 - 若遇到
mb_substr返回空或异常,先检查字符串是否真实为 UTF-8 编码(可用mb_check_encoding($str, 'UTF-8')辅助判断)
PHP 7.4 已停止常规更新,仅接收严重安全补丁。如果项目仍在用 7.4,建议尽快规划升级至受支持版本(如 8.2+),以获得更健壮的多字节字符串处理能力。



















