将JSF输入提交值的请求字符编码设置为UTF-8

Los*_*809 6 jsf utf-8 character-encoding http-request-parameters

我遇到的问题与在GlassFish中将JSF输入提交值的设置请求字符编码设置为UTF-8相同,提交的值以Mojibake形式到达.但是,答案是针对GlassFish而我正在使用JBoss AS 7.

我已经指定了JDBC连接URL以使用UTF-8:

jdbc:mysql://localhost:3306/mydb?useUnicode=yes&characterEncoding=UTF-8
Run Code Online (Sandbox Code Playgroud)

在我的JSF页面顶部:

<?xml version='1.0' encoding='UTF-8' ?>
Run Code Online (Sandbox Code Playgroud)

如何在JBoss AS 7中解决同样的问题?或者更好,以更通用的方式使其适用于所有服务器?

Bal*_*usC 12

您链接到的问题已经排除了DB编码的原因,因为在保存到DB之前打印/重新显示提交的值期间已经出现问题.因此,问题在于HTTP请求编码.

指定了charset的JDBC连接URL,

jdbc:mysql://localhost:3306/mydb?useUnicode=yes&characterEncoding=UTF-8
Run Code Online (Sandbox Code Playgroud)

只告诉MySQL JDBC驱动程序使用UTF-8解码SQL查询中的值,然后再将其发送到DB.这不仅完全超出了JSF的范围,而且这也不是导致问题的原因,前提是您绝对肯定您遇到与链接问题相同的问题.

指定了charset的XML prolog,

<?xml version='1.0' encoding='UTF-8' ?>
Run Code Online (Sandbox Code Playgroud)

只告诉XML解析器在构建XML源代码之前使用UTF-8解码XML源代码.实际使用的XML解析器是在JSF视图构建时间内由Facelets内部使用的SAX.这部分与HTTP请求/响应编码完全无关,因此不太可能导致您的问题.

它们都不设置HTTP请求编码,而您需要设置HTTP请求编码.您链接到的问题已经显示了如何为Glassfish服务器执行此操作.在您的情况下,您使用的是JBoss AS服务器.特定于Glassfish的设置不适用,JBoss不支持这样的设置.您需要引入自定义servlet过滤器来完成这项工作.例如

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 难以置信.我们在2014年,使用最新的操作系统,JEE,应用程序服务器,数据库 - 所有UTF-8.我们仍然需要一些解决方法来正确处理特殊字符.谢谢你的解决方案! (4认同)