为何含特殊字符的变量名会在部分Freemarker服务上触发解析报错
问题原因
\ufffd是字符编码解码失败时的占位替换字符,该报错核心是两台服务器的默认文件编码不一致,Freemarker解析模板时使用了错误的编码读取包含非ASCII字符(如模板中的ä)的模板文件,导致字符解析异常。
Freemarker 2.3.23默认会读取JVM的file.encoding系统属性作为模板解析的默认编码,故障服务器的Karaf运行环境默认编码与模板实际存储编码不匹配。
解决方案
按优先级从高到低选择即可:
- 方案1(最推荐,无环境依赖):在FTL模板头部显式声明模板编码
在模板第一行的<#ftl>标签中添加encoding属性,指定模板实际存储的编码,如模板为UTF-8编码则修改为:<#ftl strip_whitespace="true" encoding="UTF-8"> - 方案2:全局统一编码配置
若自行初始化Freemarker配置,给Configuration对象设置全局默认编码:
若使用Karaf内置Freemarker服务,修改Karaf启动参数强制指定JVM默认编码:configuration.setDefaultEncoding("UTF-8");
编辑Karaf bin目录下的配置文件:- Linux/Unix环境修改
setenv.sh,添加:export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" - Windows环境修改
setenv.bat,添加:set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
- Linux/Unix环境修改
- 方案3:根源规避
确认所有模板文件均以UTF-8编码存储,同时尽量避免使用非ASCII字符作为变量名,例如将wän修改为waen,从根源上消除编码解析风险。
内容的提问来源于stack exchange,提问作者artaxerxe
相关产品推荐
相关产品推荐

