【问题标题】:How to set character encoding for vertx.io staticHandler?如何为 vertx.io staticHandler 设置字符编码?
【发布时间】:2016-08-10 13:12:28
【问题描述】:

由于升级到最新的 Vertx 3.2.2,StaticHandler 从使用 Windows-1252 编码的文件系统返回静态 css、html 等资源。以前的 Vertx 版本没有说明任何编码。

现在,所有 utf-8 数据(如 iconfont 图标字符)都是乱码。

我曾尝试手动将 UTF8 BOM 添加到文件的开头,StaticHandler 仍然用作 Windows-1252(但至少浏览器能够识别 utf 标记并很好地呈现)。

如何强制使用首选字符编码,或让 statichandler 识别文件编码?

【问题讨论】:

  • 您是否尝试过设置文件编码系统属性? -Dfile.encoding=UTF-8
  • 不,但现在我试过了。不幸的是,它没有帮助。 (我还想知道是否有完整的 vertx 特定系统属性列表。找到 vertx.cwd 花了我一个小时。)
  • 嗯,你可能是对的。然而,这 - 与其他参数不同 - 必须作为命令行参数给出,因为 System.setProperty 不起作用。不过,我找到了一个不错的解决方法。
  • 不确定你的意思。如果您使用 CLI,则可以设置 java-opts 参数或 JAVA_OPT 环境变量。

标签: utf-8 character-encoding vert.x


【解决方案1】:

没有特定的 Vert.x 属性。 如果您查看实际的 StaticHandlerImpl 实现,您会发现它的作用很简单:

String defaultContentEncoding = java.nio.charset.Charset.defaultCharset().name();

其中 Charset 是标准 Java 类。 因此在 VM 选项中设置 -Dfile.encoding=UTF-8 将适用于 Vert.x。

我强烈建议您不要使用反射来解决该问题,因为它非常 hacky。

【讨论】:

  • 感谢您的建议!我同意以这种方式使用反射并不好。另一方面,从 vert.x 提供具有任意平台特定字符集的 utf8 文件也不是很好。我更喜欢保留基于反射的解决方案,因为不小心关闭运行时参数会导致 Web 应用程序出现异常。其他平台,例如 Play!框架将简单地将所有内容强制为 utf-8。它也是任意的,但至少相当不错。
【解决方案2】:

回答我自己的问题:

System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

发件人:Setting the default Java character encoding?

【讨论】:

  • 您介意在 GitHub 上的 vertx-web 项目中打开一个问题吗?指出您以前拥有哪个版本,理想情况下是一个小复制器?顺便说一句,没有 3.2.2 版本,所以也许您的意思是 3.3.2?
  • 我创建了一个问题,请参阅vert.x issue 221
【解决方案3】:

从 vertx 3.4.0 你可以做到

StaticHandler.create().setDefaultContentEncoding("UTF-8");

docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    相关资源
    最近更新 更多