为什么变量名中的特殊字符会报错?

Why Special Character in Variable Name Gives Error?

我有以下 freemarker 文件:

<#ftl strip_whitespace="true">
...
<#assign wän = ...>

如果我在一台服务器上 运行 这样的 freemarker,它运行良好,如果我 运行 它在另一台服务器上,我得到这个:

freemarker.core.ParseException: Syntax error in template "template-name.ftl" in line 15, column 100: Lexical error: encountered "\ufffd" (65533), after "". at freemarker.core.TokenMgrError.toParseException(TokenMgrError.java:247)[445:org.freemarker.freemarker:2.3.23.stable]

我的freemarker版本是2.3.23.stable.

任何提示我应该做什么才能 运行 这个有问题的服务器上的模板?

N.B。我 运行 来自 Apache Karaf 的 freemarker 模板。

我猜你的模板是一些 non-UTF-8 字符集(可能是 ISO-8859-1),但是 FreeMarker 的 defaultEncoding 配置设置没有设置,所以它使用默认的操作系统。 OS 默认值是 non-UTF-8 字符集,它将起作用。但是在 OS 默认为 UTF-8 的情况下,代码 127 以上的字符将被视为无效的 UTF-8 字节序列,并且 Java 会将它们替换为 U+FFFD 字符。

更新:另一种获取 U+FFFD 字符的方法是读取具有 US-ASCII 字符集的 non-US-ASCII(例如 UTF-8、ISO-8859-1 等)文件,因为那里超过 127 的字符代码是非法的。

正在设置默认字符集:

  • 在 java 中:configuration.setDefaultEncoding("..."),其中 configuration 是您已经在使用的 freemarker.template.Configuration object
  • .properties 文件中(如果 FreeMarker 是从该文件配置的):defaultEncoding=...
  • 每个模板:<#ftl encoding="..."> header