编辑博客文章触发escape:unsupported type:UTF-8报错求助
问题描述
- 触发场景:点击编辑按钮修改博客文章时触发系统提示
- 错误信息:"User Notice: escape: unsupported type: UTF-8 - returning unmodified string"
- 系统定位的错误来源:
smarty.config.inc.php文件,对应代码行:
return smarty_modifier_escape($string, $esc_type, $char_set, $double_encode);
- 已尝试的修复操作:
- 修改
classes/Tools.php内htmlentitiesUTF8()函数,将函数内htmlentities替换为htmlspecialchars- 修改前代码:
return htmlentities((string) $string, $type, 'utf-8');- 修改后代码:
return htmlspecialchars((string) $string, $type, 'utf-8'); - 已确认后台
Configuration->Database配置项中编码设置为UTF-8,以上操作后问题仍存在。
- 修改
排查修复方案
按优先级从高到低排查:
- 优先检查模板中
|escape修饰符的参数顺序错误:这个报错的核心原因是Smarty的escape修饰符把「UTF-8」识别成了转义类型,而Smarty支持的转义类型只有html/htmlall/url/quotes/javascript等,没有UTF-8这个类型,说明参数传位错位了。全局搜索所有模板文件中用到|escape的位置,检查是否存在{$变量|escape:'UTF-8'}这类错误写法——Smarty的escape语法参数顺序固定为{$var|escape:转义类型:字符集:是否双编码},把错误写法修正为{$var|escape:'html':'UTF-8'}即可,这类写法错误占该问题诱因的90%以上。 - 检查Smarty转义函数的参数默认值是否被篡改:找到Smarty核心文件
modifier.escape.php,查看smarty_modifier_escape函数的定义,确认第二个参数$esc_type的默认值为'html',第三个参数$char_set默认值为当前系统使用的编码,如果之前二次开发时调换过两个参数的默认位置,改回官方默认顺序即可。 - 修复旧版Smarty与高版本PHP的兼容问题:如果你使用的是Smarty 3.1.30以下版本搭配PHP8及以上环境,旧版本Smarty没有对传入的待转义变量做类型校验,当待转义变量不是字符串类型(比如传了数组、null、布尔值)时,会出现参数位偏移,把后面的字符集参数顶到转义类型的参数位触发报错。可以在
smarty.config.inc.php调用smarty_modifier_escape前补全参数校验逻辑:
// 补全校验逻辑 $string = is_scalar($string) ? (string)$string : ''; $esc_type = empty($esc_type) ? 'html' : $esc_type; $char_set = empty($char_set) ? 'UTF-8' : $char_set; $double_encode = isset($double_encode) ? (bool)$double_encode : true; // 原有调用逻辑 return smarty_modifier_escape($string, $esc_type, $char_set, $double_encode);
- 回滚之前对
htmlentitiesUTF8()函数的修改:把htmlspecialchars改回原来的htmlentities,这个修改和当前报错没有关联,反而可能导致特殊字符转义不全引发其他安全或显示问题。 - 校验数据库连接的实际编码:不要只看后台配置项,在数据库连接初始化的位置打印当前连接编码,确认连接建立后执行了对应编码的设置语句(utf8对应
SET NAMES utf8,utf8mb4对应SET NAMES utf8mb4),避免从数据库读取的内容携带异常编码标记,导致转义函数识别异常。
内容的提问来源于stack exchange,提问作者OmarAc
相关产品推荐
相关产品推荐

