【问题标题】:Why Special Character in Variable Name Gives Error?为什么变量名中的特殊字符会出错?
【发布时间】:2021-12-09 04:06:19
【问题描述】:

我有以下 freemarker 文件:

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

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

freemarker.core.ParseException:模板中的语法错误 第 15 行第 100 列中的“template-name.ftl”:词法错误:遇到 "\ufffd" (65533),在 "" 之后。在 freemarker.core.TokenMgrError.toParseException(TokenMgrError.java:247)[445:org.freemarker.freemarker:2.3.23.stable]

我的 freemarker 的版本是 2.3.23.stable。

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

注意我从 Apache Karaf 运行我的 freemarker 模板。

【问题讨论】:

    标签: freemarker


    【解决方案1】:

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

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

    设置默认字符集:

    • 在 java 中:configuration.setDefaultEncoding("..."),其中configuration 是您已经在使用的freemarker.template.Configuration 对象
    • .properties 文件中(如果从中配置了 FreeMarker):defaultEncoding=...
    • 每个模板:带有&lt;#ftl encoding="..."&gt; 标头

    【讨论】:

    • hmmm.... 实际上,在这两种环境中,我都将 UTF-8 设置为默认系统编码。
    • 模板文件实际使用什么字符集?就像你用一些文本编辑器而不是通过 FreeMarker 来查看它一样。
    • 经过一番调查,我意识到应该归咎于OSGI环境。我在启动时设置了 -Dfile.encoding=UTF-8 并且运行良好。但是谢谢,你的观点帮助我找到了问题。
    • 这个错误似乎是用UTF-8字符集解码非UTF-8模板文件引起的,所以我想知道在那里添加-Dfile.encoding=UTF-8有什么帮助?
    • 确实如此。将此添加到我的答案中。
    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多