字符编码不适用于PrimeFaces CellEditor组件

时间:2011-12-09 14:12:24

标签: java character-encoding jsf-2 primefaces mojibake

使用<p:rowEditor>

编辑表格时遇到问题

我使用encoding='windows-1252'来使用瑞典字符 (å, ä, ö)。创建实体工作正常但是当我使用<p:dataTable><p:cellEditor>中编辑它时,它会提交意外的字符。 (如果我输入"åäö"并保存编辑(使用p:celleditor),则数据库中的表包含"åäö")。

我的xhtml页面如下所示:

<?xml version='1.0' encoding='windows-1252' ?> 
<!DOCTYPE html>
<html...

我尝试过使用字符编码过滤器:

public class CharacterEncodingFilter implements Filter {

    private static String ENCODING = "windows-1252";

    @Override
    public void destroy() {
    }

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

    @Override
    public void init(FilterConfig config) throws ServletException {
    }
}

但无济于事。有关使用不同字符编码的incell编辑帖子的任何想法吗?

使用:

  • NetBeans 7.0.1
  • Glassfish 3.1
  • Primefaces 3.0.M4

1 个答案:

答案 0 :(得分:9)

  

如果我输入“åäö”并保存编辑(使用p:celleditor),则数据库中的表格包含“åö”

这是UTF-8编码字符的典型CP1252表示。在UTF-8中,这些字符由以下字节表示:

如果您在CP1252 codepage layout中查找这六个字节,您会看到它们代表的是åäö字符。

在生成HTML响应和处理POST请求时,JSF / Facelets默认使用UTF-8字符编码。 XML encoding属性实际上并没有改变任何内容。它只是告诉XML解析器您编写/保存文件的字符编码,以便它可以使用正确的字符编码对其进行解析。

通过设置视图根标记encoding的{​​{1}}属性来更改HTML响应的字符编码和处理POST请求:

<f:view>

但是,我强烈反对这一点。这样,您就可以从支持超过一百万个字符的通用字符编码回退到专有字符编码,该编码支持不超过255个字符,并且仅由Windows平台理解。使用Mac / Linux或任何其他操作系统的网页访问者将无法正确解释该字符编码中的HTML响应,也无法以该字符编码发回数据。您的网络应用程序不会为成功的世界统治做好准备。

您需要以不同方式解决此问题。显然,您的数据库需要更改才能支持UTF-8。究竟如何做到这一点无法回答,因为你没有告诉任何关于DB make / version的内容。但是更改数据库/表的字符编码应该是一些SQL命令的问题。或者,如果您正在尝试,只需截断数据库并使用正确的字符集重新创建它。有关详细信息,请参阅特定于DB的SQL手册。

另见: