因为 substr() 针对的是英文字符串,中文字符串需要用 mb_substr()

为什么使用了 mb_substr() 之后依然出现乱码呢?

这与 mb_substr("为中华之崛起而读书",0, 6, "utf-8") 中的第一个参数和第四个参数有关。参考 php 判断字符串长度 strlen() 与 mb_strlen() 函数用法与不同环境下的测试,在 PHP 低版本(5.2)环境下执行 PHP 脚本时(非交互环境),当脚本格式为 utf-8(即第一个参数编码格式为 utf-8),mb_* 函数第四个参数为 utf-8 时,返回结果是可信的。PHP 高版本结果本身就是可信的,不需要额外配置第四个参数(字符串编码非 utf-8 的情况除外)。