JSF字符获得双UTF-8编码

oni*_*unn 1 java jsf character-encoding

上周我问了一个问题,但JSF和charset编码

相关的问题

现在我将这个JSF包含在我的JBoss Portal环境中.与常见的jboss portlet桥接器.当我提交表单时,会发生一些奇怪的事情:

门户网站是UTF-8所以我的表单输入也是UTF-8但是在提交之后,字符再次被编码为UTF-8,导致这样的东西

äöü
Run Code Online (Sandbox Code Playgroud)

如果再次提交响应页面,则会变为此

äöü
Run Code Online (Sandbox Code Playgroud)

您可以点击提交按钮,看到每次都会对字符进行编码.

这是否按预期工作?

Bal*_*usC 5

当最初使用解码的数据UTF-8被错误编码时,会发生这种情况ISO-8859-1.您可以通过以下方式轻松复制:

String input1 = new String("äöü");
System.out.println(input1); // äöü
String input2 = new String(input1.getBytes("UTF-8"), "ISO-8859-1");
System.out.println(input2); // äöü
String input3 = new String(input2.getBytes("UTF-8"), "ISO-8859-1");
System.out.println(input3); // äöü
Run Code Online (Sandbox Code Playgroud)

(请注意,最后一个实际上包含更多字符,但是SO的消息解析器会吃掉它们).

这意味着您的webapp中的某个地方ISO-8859-1被错误地使用而不是UTF-8.用给定的信息很难确定根本原因.您可以尝试在JSF bean操作方法中sysout请求参数并读取stdout中的输出(您只需要确保stdout UTF-8也在使用!如果您使用的是像Eclispe这样的IDE,则可以在Workspace中配置它偏好).如果这些字符看起来也是垃圾,那么请求编码是错误的.如果这些字符看起来很好,那么响应或webbrowser编码是错误的.要排除Web浏览器不被怀疑,您可以在例如Firefox中确定View > Character Encoding使用的编码.