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

Den*_*s S 2 java character-encoding primefaces mojibake jsf-2

我在编辑表格时遇到了一些问题 <p:rowEditor>

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

我的xhtml页面如下所示:

<?xml version='1.0' encoding='windows-1252' ?> 
<!DOCTYPE html>
<html...
Run Code Online (Sandbox Code Playgroud)

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

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 {
    }
}
Run Code Online (Sandbox Code Playgroud)

但无济于事.为什么incell编辑帖子使用不同的字符编码?

使用:

  • NetBeans 7.0.1
  • Glassfish 3.1
  • Primefaces 3.0.M4

Bal*_*usC 9

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

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

如果在CP1252代码页布局中查找这六个单独的字节,您将看到它们正好代表那些字符åäö.

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

更改HTML响应的字符编码和POST请求的处理将通过设置encoding视图根标记的属性来完成<f:view>:

<f:view encoding="CP1252">
Run Code Online (Sandbox Code Playgroud)

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

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

也可以看看: