CQ5/AEM 调度程序不保留字符集信息
CQ5/AEM Dispatcher not retaining charset information
当我们从发布实例中提取内容时,我们得到一个内容类型 header,表明内容是 "charset=utf-8"。当调度程序提供此文件时,字符集信息丢失。对于查看 html 中声明的编码的网页来说,这不是问题,但是有许多第三方库(包括来自 Adobe 的库)将其作为 iso-8859-1 处理,如果该内容没有类型声明。
我正在尝试确定是否可以将调度程序配置为添加此信息。
实际上调度程序只缓存内容,没有headers。如果页面是从缓存中加载的,它的行为与 Apache 提供的任何其他静态文件非常相似。调度程序本身没有任何字符集配置,但我认为添加
AddDefaultCharset utf-8
Apache 配置应该可以解决这个问题。可以在 Apache docs.
中找到更多信息
这可能对某些人有所帮助,但如果您是从 Java servlet 创建的,请确保先设置 headers。在 author/publish 中,如果由于其他配置和访问页面的方式而未设置这些内容,似乎能够处理。
所以下面(你有你的 DOGET 方法),你需要指定你的 headers 作为第一件事,否则编码将无法正确设置。
protected void doGet(@Nonnull SlingHttpServletRequest request, @Nonnull SlingHttpServletResponse response) throws IOException, ServletException {
response.setContentType(com.adobe.granite.rest.Constants.CT_JSON);
response.setCharacterEncoding(com.adobe.granite.rest.Constants.DEFAULT_CHARSET);
....
}
在我的例子中,AEM 和网络服务器有正确的信息,但问题是编码和内容类型的设置发生在稍后,而应该立即定义。
当我们从发布实例中提取内容时,我们得到一个内容类型 header,表明内容是 "charset=utf-8"。当调度程序提供此文件时,字符集信息丢失。对于查看 html 中声明的编码的网页来说,这不是问题,但是有许多第三方库(包括来自 Adobe 的库)将其作为 iso-8859-1 处理,如果该内容没有类型声明。
我正在尝试确定是否可以将调度程序配置为添加此信息。
实际上调度程序只缓存内容,没有headers。如果页面是从缓存中加载的,它的行为与 Apache 提供的任何其他静态文件非常相似。调度程序本身没有任何字符集配置,但我认为添加
AddDefaultCharset utf-8
Apache 配置应该可以解决这个问题。可以在 Apache docs.
中找到更多信息这可能对某些人有所帮助,但如果您是从 Java servlet 创建的,请确保先设置 headers。在 author/publish 中,如果由于其他配置和访问页面的方式而未设置这些内容,似乎能够处理。
所以下面(你有你的 DOGET 方法),你需要指定你的 headers 作为第一件事,否则编码将无法正确设置。
protected void doGet(@Nonnull SlingHttpServletRequest request, @Nonnull SlingHttpServletResponse response) throws IOException, ServletException {
response.setContentType(com.adobe.granite.rest.Constants.CT_JSON);
response.setCharacterEncoding(com.adobe.granite.rest.Constants.DEFAULT_CHARSET);
....
}
在我的例子中,AEM 和网络服务器有正确的信息,但问题是编码和内容类型的设置发生在稍后,而应该立即定义。